C#中的where泛型约束中的new()
2013-12-10 15:06
351 查看
原文: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#创建的类默认都有一个无参的构造函数,即使你没有写,但是如果你写了一个有参数的构造函数后,那么就没有默认无参的那个了,就需要自己手动写一个。
还是拿前两天的国籍那个举个例子:
/// <summary> /// 国籍的接口 /// </summary> public interface INationality { string Nationality { set; } string GetNationality(); }
2.国籍的接口不用改变还是这个,继承此接口的类稍微修改了一下,为每个类增加一个构造方法,改造如下:
/// <summary> /// 中国人 /// </summary> 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; } } /// <summary> /// 美国人 /// </summary> 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.其实变动也不大,泛型类也没有修改,但是会报错,在创建实例化对象的地方,如下:
/// <summary> /// /// </summary> ///<remarks> /// 由于此处有new()的约束,所以编译器编译的时候无法通过,那么就将new()去掉, /// 或者为继承INationality的类增加public类型的无参构造函数 /// </remarks> public class PrintNationality<T> 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类型必须有公有的无参的构造函数。
相关文章推荐
- C#中的where泛型约束中的new()使用(转)
- C#中的where泛型约束中的new()构造函数约束
- C#中的where泛型约束中的new()构造函数约束
- c# 泛型T类型参数T的约束where
- c# 泛型类型参数T的约束where
- C# 泛型 WHERE 约束
- 泛型类型参数约束 <T> where T : class,new(){}
- c# 泛型 类型参数上的限制(where T:class,new())
- C#中的where泛型约束
- C# 泛型new约束关键字
- C#中泛型约束(where)是什么?
- C# 泛型约束 xxx Where T:约束(二)
- where(泛型类型约束)(C# 参考)
- C# 泛型类型约束 where
- c#中的WHERE语句 ——where(泛型类型约束)
- 关于C#中泛型类型参数约束(where T : class)
- C#中的where泛型约束
- C#中的where泛型约束
- C# 泛型和其中的new 约束
- c#泛型类型的约束条件where