where关键字用于generic type constraint,声明类型参数必须具备的功能。
// generic type指代模板中的类型T // 1.要求generic type实现IComparable<T>接口 public class AGenericClass<T> where T : IComparable<T> { } // 2.表明generic type的基类 // 该基类约束一经使用,就必须出现在该类型参数的所有其他约束之前 public class UsingEnum<T> where T : System.Enum { } // 3.表明generic type应该是class或者struct class MyClass<T, U> where T : class where U : struct { } // 4.default避免被override // 指定派生类在派生类中没有约束的情况下重写方法 public abstract class B { public void M<T>(T? item) where T : struct { } public abstract void M<T>(T? item); } public class D : B { // Without the "default" constraint, the compiler tries to override the first method in B public override void M<T>(T? item) where T : default { } } // 5.限制generic type不能为null class NotNullContainer<T> where T : notnull { } // 6.限制generic type为unmanaged(“非托管类型”应该是值类型) class UnManagedWrapper<T> where T : unmanaged { } // 7.限制generic type可以实例化 // 提供的任何类型参数都必须具有可访问的无参数构造函数 public class MyGenericClass<T> where T : IComparable<T>, new() { // The following line is not possible without new() constraint: T item = new T(); } // 可以同时使用多个where限制多个generic types // 可以用于类,函数和委托