可以被解釋為對帶有兩個參數G<A和B>(7)的F的調用[1]。同樣,它還能被解釋為對帶有一個參數的F的調用,這是一個對帶有兩個類型實參和一個正式參數的泛型方法G的調用。 如果表達式可以被解析為兩種不同的有效方法,那麼在“>”能被解析作為運算符的所有或一部分時,或者作為一個類型實參列表,那麼緊隨“>”之後的標記將會被檢查。如果它是如下之一: { } ] > : ; , . ? 那麼“>”被解析作為類型實參列表。否則“>”被解析作為一個運算符。 20.6.6對委托使用泛型方法 委托的實例可通過引用一個泛型方法的聲明而創建。委托表達式確切的編譯時處理,包括引用泛型方法的委托創建表達式,這在§20.9.6中進行了描述。 當通過委托調用一個泛型方法時,所使用的類型實參將在委托實例化時被確定。類型實參可以通過類型實參列表顯式給定,或者通過類型推斷(§20.6.4)而確定。如果采用類型推斷,委托的參數類型將被用作推斷處理過程的實參類型。委托的返回類型不用於推斷。下面的例子展示了為一個委托實例化表達式提供類型實參的方法。 delegate int D(string s , int i) delegate int E(); class X { public static T F<T>(string s ,T t){…} public static T G<T>(){…} static void Main() { D d1 = new D(F<int>); //ok,類型實參被顯式給定 D d2 = new D(F); //ok,int作為類型實參而被推斷 E e1 = new E(G<int>); //ok,類型實參被顯式給定 E e2 = new E(G); //錯誤,不能從返回類型推斷 } } 在先前的例子中,非泛型委托類型使用泛型方法實例化。你也可以使用泛型方法創建一個構造委托類型的實例。在所有情形下,當委托實例被創建時,類型實參被給定或可以被推斷,但委托被調用時,可以不用提供類型實參列表(§15.3)。
interface IComparable<T> { int CompareTo(T value); } interface IKeyProvider<T> { T GetKey(); } class Printer<T> where T:IPrintable{…} class SortedList<T> where T: IComparable<T>{…} class Dictionary<K,V> where K:IComparable<K> where: V: IPrintable,IKeyProvider<K>,new() { … }
下面的例子是一個錯誤,因為它試圖直接使用一個類型參數作為約束。 class Extend<T , U> where U:T{…}//錯誤 約束的類型參數類型的值可以被用於訪問約束暗示的實例成員。在例子 interface IPrintable { void Print(); } class Printer<T> where T:IPrintable { void PrintOne(T x) { x.Pint(); } } IPrintable的方法可以在x上被直接調用,因為T被約束總是實現IPrintable。
class Program { static void Test<T>() where T:new ,ICounter{ T x = new T(); Console.WriteLine(x); x.Increment(); //修改x` Console.WriteLine(x); ((ICounter)x).Increment(); //修改x的裝箱拷貝 Console.WriteLine(x); } static void Main() { Test<Counter>(); } }