泛型種類: 1)泛型類 2)泛型介面 3)泛型方法 4)泛型數組 5)泛型委托 6)泛型結構 泛型約束: 為什麼要使用泛型約束? 通過約束類型參數,可以增加約束類型及其繼承層次結構中的所有類型所支持的允許操作和方法調用的數量。設計泛型類或方法時,如果要對泛型成員執行除簡單賦值之外的任何操作或調用Sy ...
泛型種類:
1)泛型類
2)泛型介面
3)泛型方法
4)泛型數組
5)泛型委托
6)泛型結構
泛型約束:
為什麼要使用泛型約束?
通過約束類型參數,可以增加約束類型及其繼承層次結構中的所有類型所支持的允許操作和方法調用的數量。設計泛型類或方法時,如果要對泛型成員執行除簡單賦值之外的任何操作或調用System.Object不支持的任何方法,則必須對該類型參數應用約束。例如,基類約束告訴編譯器,僅此類型的對象或派生自此類型的對象可用作類型參數。編譯器有了此保證後,就能夠允許在泛型類中調用該類型的方法。
泛型約束的類型:
1)where T : struct => 類型參數必須是值類型。可以指定除Nullable<T>以外的任何值類型。
2)where T : class => 類型參數必須是引用類型。此約束還應用於任何類、介面、委托或數組類型。
3)where T : notnull => 類型參數必須是不可為null的類型。(C#8.0開始)
4)where T : unmanaged => 類型參數必須是非托管類型。
5)where T : new() => 類型參數必須具有公共無參數構造函數。
6)where T : <基類名> => 類型參數必須是指定的基類或派生自指定的基類。
7)where T : <介面名稱> => 類型參數必須是指定的介面或實現指定的介面。可指定多個介面約束。約束介面也可以是泛型。
8)where T : U => 為 T 提供的類型參數必須是為U提供的參數或派生自為U提供的參數。
使用泛型約束的細節:
1)與其他約束一起使用時,new()約束必須最後指定。
2)class或struct約束必須再其他任何約束之前。
3)struct約束包含new()約束,且new()約束不能與struct約束結合使用。
4)unmanaged約束包含struct約束,unmanaged約束不能與struct或new()約束結合使用
泛型約束的使用類型:
1)泛型約束可以是一個泛型類型參數對應一個約束,或多個約束
2)泛型約束也可以是多個泛型參數對應多個約束
未綁定約束的類型參數有哪些特點:
1)不能使用 != 和 == 運算符,因為無法保證具體的類型參數能支持這些運算符。
2)可以在它們與System.Object之間來迴轉換,或將它們顯式轉換為任何介面類型。
3)可以將它們與null進行比較。將未綁定的參數與null進行比較時,如果類型參數為值類型,則該比較將始終返回false。
【註:】
1)從C#7.3開始,可使用unmanaged約束來指定類型參數必須為非托管類型。
2)從C#7.3開始,可將 System.Delegate 或 System.MulticastDelegate 或 System.Enum 用作基類約束。CLR始終允許此約束,但 C# 語言不允許。