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來完成編譯器的類型檢查。