where T:new()

      在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。这些限制称为约束。约束是使用 where 上下文关键字指定的。

基本形式: where T : new()

在使用new()约束时,必须通过调用该无参构造函数来创建对象

声明了一个叫做Assemble<T>的泛型类,然后T的限制为必须要有一个无参构造函数。
 
如下:
public class Assemble<T> where T:new()
{
         public string SayHello<T> (T object)
         {
               T ass=new T();
               return ass.ToString();
          }
}
 
public class legal
{
           public legal()
           {
           }
}
 
public class notlegal
{
          public notlegal(string someting)
          {
          }
}
 
当声明Assemble<legal> ass=new Assemble<legal>();时相当于声明了一个Assemble<T>,其中第一个代码端中的T全部替换为 legal。当声明Assemble<notlegal> ass=new Assemble<notlegal>();时,由于Assemble<T>中T要求必须具有无参构造器,所以,这句话会报错。
 
附上msdn几种约束形式:
where T:new() - lisknove - Asp.Net Code Academy
 
在应用 where T : class 约束时,建议不要对类型参数使用 == 和 != 运算符,因为这些运算符仅测试引用同一性而不测试值相等性。即使在用作参数的类型中重载这些运算符也是如此。下面的代码说明了这一点;即使 String 类重载 == 运算符,输出也为 false。
 
Reference:
原文地址:https://www.cnblogs.com/yxyht/p/2818238.html