interface IData{void method();} interface IOperation<T> where T : IData{ void Run(T data);} 然后我们分别定义不同类型的数据和操作类:
代码 class AddData : IData{ public int A1, A2; public void method() { } } class Add : IOperation<AddData>{ public void Run(AddData d) { Console.WriteLine(d.A1 + d.A2); } } class ComplexData : IData{ public void method() { } public int A1, A2, B1, B2; } class ComplexAdd : IOperation<ComplexData>{ public void Run(ComplexData d) { Console.WriteLine("{0}+{1}i",d.A1 + d.A2,d.B1+d.B2); } } 这里如果能这样使用我们认为应该是安全的:
IOperation<IData> oPR = new Add(); opr.Run(data1); opr = new ComplexAdd(); opr.Run(data2);
另外一个值得注意的约束关键字是new(), new 关键字意味着泛型对象必须提供一个无参构造函数,需要注意的是,new()约束必须放在所有约束的最后面。这个约束有时会有用,不过有时看起来更像鸡肋。首先,new()约束虽然表明你可以在类中对泛型对象使用new()操作符实例化对象,然而在CIL对该对象的实例化仍然是通过反射来实现的,即T a=new T()相当于T a = System. Activator. CreateInstance<T>();这样程序效率会有所降低。另一方面,目前new约束仅仅支持无参构造函数的约束,而无法支持用户自定义参数的构造函数约束,虽然用户可以自己通过工厂方法来传递参数,但终究不够自由,这让new()约束有时没太大用武之地。
约束不支持委托和枚举类型,例如,你不能这样定义:class ClassA<T> where T:Delegate. 这是由于委托和枚举被认为是特殊的类,它无法被指定为类型参数。编译器无法根据Delegate来完成编译器的类型检查。