天天看點

類型參數的限制(C# 程式設計指南) 類型參數的限制(C# 程式設計指南)

visual studio 2005

<a target="_blank">其他版本</a>

類型參數的限制(C# 程式設計指南) 類型參數的限制(C# 程式設計指南)

在定義泛型類時,可以對用戶端代碼能夠在執行個體化類時用于類型參數的類型種類施加限制。如果用戶端代碼嘗試使用某個限制所不允許的類型來執行個體化類,則會産生編譯時錯誤。這些限制稱為限制。限制是使用 where 上下文關鍵字指定的。下表列出了六種類型的限制:

限制

說明

t:結構

t:類

類型參數必須是引用類型,包括任何類、接口、委托或數組類型。

t:new()

類型參數必須具有無參數的公共構造函數。當與其他限制一起使用時,new() 限制必須最後指定。

t:&lt;基類名&gt;

類型參數必須是指定的基類或派生自指定的基類。

t:&lt;接口名稱&gt;

類型參數必須是指定的接口或實作指定的接口。可以指定多個接口限制。限制接口也可以是泛型的。

t:u

為 t 提供的類型參數必須是為 u 提供的參數或派生自為 u 提供的參數。這稱為裸類型限制。

<a target="_blank">使用限制的原因</a>

<a target="_blank"></a>

<a target="_blank">c#</a>

限制使得泛型類能夠使用 employee.name 屬性,因為類型為 t 的所有項都保證是 employee 對象或從 employee 繼承的對象。

可以對同一類型參數應用多個限制,并且限制自身可以是泛型類型,如下所示:

通過限制類型參數,可以增加限制類型及其繼承層次結構中的所有類型所支援的允許操作和方法調用的數量。是以,在設計泛型類或方法時,如果要對泛型成員執行除簡單指派之外的任何操作或調用 system.object 不支援的任何方法,您将需要對該類型參數應用限制。

false。

這種情況的原因在于,編譯器在編譯時僅知道 t 是引用類型,是以必須使用對所有引用類型都有效的預設運算符。如果需要測試值相等性,建議的方法是同時應用 where t : icomparable&lt;t&gt; 限制,并在将用于構造泛型類的任何類中實作該接口。

<a target="_blank">未綁定的類型參數</a>

沒有限制的類型參數(如公共類 sampleclass&lt;t&gt;{} 中的 t)稱為未綁定的類型參數。未綁定的類型參數具有以下規則:

不能使用 != 和 == 運算符,因為無法保證具體類型參數能支援這些運算符。

可以在它們與 system.object 之間來回轉換,或将它們顯式轉換為任何接口類型。

<a target="_blank">裸類型限制</a>

用作限制的泛型類型參數稱為裸類型限制。當具有自己的類型參數的成員函數需要将該參數限制為包含類型的類型參數時,裸類型限制很有用,如下面的示例所示:

在上面的示例中,t 在 add 方法的上下文中是一個裸類型限制,而在 list 類的上下文中是一個未綁定的類型參數。

裸類型限制還可以在泛型類定義中使用。注意,還必須已經和其他任何類型參數一起在尖括号中聲明了裸類型限制:

泛型類的裸類型限制的作用非常有限,因為編譯器除了假設某個裸類型限制派生自 system.object 以外,不會做其他任何假設。在希望強制兩個類型參數之間的繼承關系的情況下,可對泛型類使用裸類型限制。