C#のwhere汎用コンストレイントのnew()
2255 ワード
原文:http://www.luacloud.com/2011/where-generic-constraint-new.html
1.MSDNの上でnew()に対してwhereの字句のコンストラクション関数の制約だと説明して、new()の制約を持ついかなるタイプにもアクセス可能な無パラメトリックコンストラクション関数が必要で、通常C#が作成したクラスのデフォルトには無パラメトリックコンストラクション関数があります.書いていなくても、パラメータのあるコンストラクション関数を書いた後、デフォルトの無パラメトリックなコンストラクション関数はありません.自分で手動で書く必要があります.
やはり先日の国籍を例に挙げます.
2.国籍のインタフェースは変えなくてもいいですか、それともこれですか.このインタフェースを継承するクラスは少し修正して、クラスごとに構造方法を追加して、以下のように改造しました.
3.実際には変動も大きくなく、汎用クラスも修正されていませんが、エラーが報告されます.インスタンス化オブジェクトを作成した場所では、次のようになります.
4.上記の問題を解決するには、INationalityを継承するインタフェースの各クラスに無参のpublic型の構造方法を追加するか、派生クラスの後ろのnew()を削除する.これにより,汎用クラスをインスタンス化する際に問題はない.
あんなにたくさん書いてあるのも小さな例ですが、実はMSDNがよく言っているのは、where文の後ろにnew()制約があれば、Tタイプには公有の無参の構造関数が必要だということです.
1.MSDNの上でnew()に対してwhereの字句のコンストラクション関数の制約だと説明して、new()の制約を持ついかなるタイプにもアクセス可能な無パラメトリックコンストラクション関数が必要で、通常C#が作成したクラスのデフォルトには無パラメトリックコンストラクション関数があります.書いていなくても、パラメータのあるコンストラクション関数を書いた後、デフォルトの無パラメトリックなコンストラクション関数はありません.自分で手動で書く必要があります.
やはり先日の国籍を例に挙げます.
///
///
///
public interface INationality
{
string Nationality
{
set;
}
string GetNationality();
}
2.国籍のインタフェースは変えなくてもいいですか、それともこれですか.このインタフェースを継承するクラスは少し修正して、クラスごとに構造方法を追加して、以下のように改造しました.
///
///
///
public class Chinese : INationality
{
public Chinese(string DefaultNationality)
{
_Nationality = DefaultNationality;
}
private string _Nationality;
public string Nationality
{
set
{
_Nationality = value;
}
}
public string GetNationality()
{
return string.IsNullOrEmpty(_Nationality) ? "Chinese." : _Nationality;
}
}
///
///
///
public class American : INationality
{
public American(string DefaultNationality)
{
_Nationality = DefaultNationality;
}
private string _Nationality;
public string Nationality
{
set { _Nationality = value; }
}
public string GetNationality()
{
return string.IsNullOrEmpty(_Nationality) ? "American." : _Nationality;
}
}
3.実際には変動も大きくなく、汎用クラスも修正されていませんが、エラーが報告されます.インスタンス化オブジェクトを作成した場所では、次のようになります.
///
///
///
///
/// new() , , new() ,
/// INationality public
///
public class PrintNationality where T : INationality, new()
{
// , “
// , "xxxx" T”
//T item = new T();
public void Print()
{
//Console.WriteLine(string.Format("Nationality:{0}", item.GetNationality()));
}
}
4.上記の問題を解決するには、INationalityを継承するインタフェースの各クラスに無参のpublic型の構造方法を追加するか、派生クラスの後ろのnew()を削除する.これにより,汎用クラスをインスタンス化する際に問題はない.
あんなにたくさん書いてあるのも小さな例ですが、実はMSDNがよく言っているのは、where文の後ろにnew()制約があれば、Tタイプには公有の無参の構造関数が必要だということです.