1.1类类型约束
有时候可能要求能将类型实参转换为特定的类类型,这是用类类型约束做到的。
public class TestDictionary<TKey, TValue> : Dictionary<TKey, TValue> where TValue : EntityBase { }
如上述代码,TestDictionary<TKey, TValue> 要求类型参数TValue提供的所有类型参数都必须隐式的转换为EntityBase类。
与接口约束不同,不允许多个类类型约束。c#不允许将类型参数约束为string或者System.Nullable<T>,否则就只有单一类型实参可供选择,类型参数就没必要存在了,直接用这个类型即可
1.2接口约束
IComparable是一个接口,可以排序或排序的类型实现
public class Program { public class Container<T, U> { /// <summary> /// 嵌套类 /// </summary> /// <typeparam name="U"></typeparam> public class Nested<U> { public void Method(T t, U u) { } } } public static void Main(string[] args) {
//这时候会报错 不能将类型“System.Text.StringBuilder”用作泛型类型或方法“ConsoleApplication2.BinaryTree<T>”中的类型形参“T”。没有从“System.Text.StringBuilder”到“System.IComparable<System.Text.StringBuilder>”的隐式引用转换。
BinaryTree<StringBuilder> b = new BinaryTree<StringBuilder>();
//下面的就可以
BinaryTree<int> b = new BinaryTree<int>();
BinaryTree<string> b = new BinaryTree<string>();
} }
//这是为了这个类中的方法实现而加的对参数的约束。
public class BinaryTree<T> where T : IComparable<T> {
}
1.3struct/class约束