泛型型別參數 (C# 程式設計手冊)

在泛型型別或方法定義中,型別參數是用戶端在產生泛型型別的變數時所指定之特定型別的替代符號 (Placeholder)。 泛型類別 (例如泛型簡介 (C# 程式設計手冊) 中列出的 GenericList<T>) 無法以原本的狀態使用,因為它不是真的型別,而比較像是型別的藍圖。 若要使用 GenericList<T>,用戶端程式碼必須藉由在角括弧內指定型別引數,以宣告和產生建構的型別。 這個特定類別的型別引數可以是編譯器能夠辨認的任意型別。 您可以建立任意數目的建構型別執行個體,每個執行個體使用不同的型別引數,如下所示:

GenericList<float> list1 = new GenericList<float>();
GenericList<ExampleClass> list2 = new GenericList<ExampleClass>();
GenericList<ExampleStruct> list3 = new GenericList<ExampleStruct>();

在 GenericList<T> 的每個執行個體中,類別內的每個 T 項目都將在執行階段被型別引數取代。 藉由這項取代動作,就會使用單一類別定義建立三個不同的型別安全和效率物件。 如需 CLR 如何執行這項取代的詳細資訊,請參閱執行階段中的泛型 (C# 程式設計手冊)

型別參數命名方針

  • 最好使用描述性名稱命名泛型型別,除非單一字母名稱可以充分自我闡明而描述性名稱無法再增添任何幫助。

    public interface ISessionChannel<TSession> { /*...*/ }
    public delegate TOutput Converter<TInput, TOutput>(TInput from);
    public class List<T> { /*...*/ }
    
  • 考慮為使用單一字母型別參數之型別使用 T 做為其型別參數名稱。

    public int IComparer<T>() { return 0; }
    public delegate bool Predicate<T>(T item);
    public struct Nullable<T> where T : struct { /*...*/ }
    
  • 最好使用 "T" 當做前置描述性型別參數名稱。

    public interface ISessionChannel<TSession>
    {
        TSession Session { get; }
    }
    
  • 考慮將指示條件約束置於參數名稱中的型別參數。 例如,限制為 ISession 的參數可以稱為 TSession。

請參閱

參考

泛型 (C# 程式設計手冊)

C++ 樣板和 C# 泛型之間的差異 (C# 程式設計手冊)

System.Collections.Generic

概念

C# 程式設計手冊