C#中的where泛型约束中的new()构造函数约束
C#中的where泛型约束中的new()构造函数约束
在MSDN上面对new()解释说到是where字句的构造函数约束,带有new()约束的任何类型都必须有可访问的无参构造函数,正常来说C#创建的类默认都有一个无参的构造函数,即使你没有写,但是如果你写了一个有参数的构造函数后,那么就没有默认无参的那个了,就需要自己手动写一个。
还是拿前两天的国籍那个举个例子:
1 /// <summary>
2 /// 国籍的接口
3 /// </summary>
4 public interface INationality
5 {
6 string Nationality
7 {
8 set;
9 }
10 string GetNationality();
11 }
国籍的接口不用改变还是这个,继承此接口的类稍微修改了一下,为每个类增加一个构造方法,改造如下:
1 /// <summary>
2 /// 中国人
3 /// </summary>
4 public class Chinese : INationality
5 {
6 public Chinese(string DefaultNationality)
7 {
8 _Nationality = DefaultNationality;
9 }
10 private string _Nationality;
11 public string Nationality
12 {
13 set
14 {
15 _Nationality = value;
16 }
17 }
18
19 public string GetNationality()
20 {
21 return string.IsNullOrEmpty(_Nationality) ? "Chinese." : _Nationality;
22 }
23 }
24
25 /// <summary>
26 /// 美国人
27 /// </summary>
28 public class American : INationality
29 {
30 public American(string DefaultNationality)
31 {
32 _Nationality = DefaultNationality;
33 }
34 private string _Nationality;
35 public string Nationality
36 {
37 set { _Nationality = value; }
38 }
39
40 public string GetNationality()
41 {
42 return string.IsNullOrEmpty(_Nationality) ? "American." : _Nationality;
43 }
44 }
其实变动也不大,泛型类也没有修改,但是会报错,在创建实例化对象的地方,如下:
1 /// <summary>
2 ///
3 /// </summary>
4 /// <typeparam name="T"></typeparam>
5 public class PrintNationality<T> where T : INationality, new()//由于此处有new()的约束,所以编译器编译的时候无法通过,那么就将new()去掉,或者为继承INationality的类增加public类型的无参构造函数
6 {
7 //T item = new T(); 在这个地方就不能创建实例化对象了,会提示错误“必须有具有公共无参构造函数的非抽象类型,才能用作泛型类型或方法"xxxx"中的参数T”
8 public void Print()
9 {
10 //Console.WriteLine(string.Format("Nationality:{0}", item.GetNationality()));
11 }
12 }
要解决上面的问题,就是给继承INationality的接口的每个类都增加一个无参的public型的构造方法,或者,将派生类后面的new()去掉。这样的话,当实例化泛型类的时候就不会有问题了。
上面写那么多也是举一个小例子,其实MSDN说的很明白,就是where字句后面有new()约束的话,T类型必须有公有的无参的构造函数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架