C# 泛型约束


  泛型约束的作用我认为是为了对泛型编程做一个规范

  比如where T : class,意思是当前泛型T必须为引用类型,值类型(int、double、float等)是不被允许作为泛型传入到类型当中的。当程序员企图在代码中这么做的时候,编译器就会报错。

  where T : <类名\接口名> 则代表当前T只能是这个类(或者是其派生类)和接口,这样就限制了泛型的范围

  至于new(),作用就是使泛型T不能带有任何除公共无参构造函数以外的任何构造函数:

1 public class A where T : I, new()
2     {
3         public void FuncA()
4         {
5             Console.WriteLine("A!");
6         }
7     }

  例如上面的代码,当A做了如此的泛型约束后,任何企图使用A的泛型的类都不能有除公共无参构造函数以外的任何构造函数。如果程序员这么做,仍然会在编译器中报错:

  A作为基类的时候,它的所有派生类都只能有无参的公共构造函数。加之C#的规则是,如果程序员没有给一个类提供一个构造函数的话,编译器会默认提供一个公共的无参构造函数,正好满足上面泛型约束的要求。所以,派生类只能不写构造函数或者是写无参的公共构造函数。

 

C