C# 泛型类型约束 where

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
// 可以用于类,函数和委托