約束告知編譯器型別引數必須具備的功能。 在沒有任何約束的情況下,型別引數可以是任何型別。 編譯器只能假定 object 的成員,它是任何 .net 型別的最終基類。 有關詳細資訊,請參閱使用約束的原因。 如果客戶端**嘗試使用約束所不允許的型別來例項化類,則會產生編譯時錯誤。 通過使用where
上下文關鍵字指定約束。 下表列出了七種型別的約束:
約束描述
where t : struct
型別引數必須是值型別。 可以指定除 nullable 以外的任何值型別。 有關詳細資訊,請參閱使用可以為 null 的型別。
where t : class
型別引數必須是引用型別。 此約束還應用於任何類、介面、委託或陣列型別。
where t : unmanaged
型別引數不能是引用型別,並且任何巢狀級別均不能包含任何引用型別成員。
where t : new()
型別引數必須具有公共無引數建構函式。 與其他約束一起使用時,new()
約束必須最後指定。
where t :
《基類名》
型別引數必須是指定的基類或派生自指定的基類。
where t :
《介面名稱》
型別引數必須是指定的介面或實現指定的介面。 可指定多個介面約束。 約束介面也可以是泛型。
where t : u
為 t 提供的型別引數必須是為 u 提供的引數或派生自為 u 提供的引數。
某些約束是互斥的。 所有值型別必須具有可訪問的無引數建構函式。struct
約束包含new()
約束,且new()
約束不能與struct
約束結合使用。unmanaged
約束包含struct
約束。unmanaged
約束不能與struct
或new()
約束結合使用。
型別引數的約束(C 程式設計指南)
在定義泛型類時,可以對客戶端 能夠在例項化類時用於型別引數的型別種類施加限制。如果客戶端 嘗試使用某個約束所不允許的型別來例項化類,則會產生編譯時錯誤。這些限制稱為約束。約束是使用 where 上下文關鍵字指定的。下表列出了六種型別的約束 約束說明 t 結構 型別引數必須是值型別。可以指定除 nul...
C 型別引數的約束
在定義泛型類時,可以對客戶端 能夠在例項化類時用於型別引數的型別種類施加限制。如果客戶端 嘗試使用某個約束所不允許的型別來例項化類,則會產生編譯時錯誤。這些限制稱為約束。約束是使用where上下文關鍵字指定的。下表列出了六種型別的約束 約束 說明 t 結構 型別引數必須是值型別。可以指定除 null...
傳遞引用型別引數(C 程式設計指南)
引用型別的變數不直接包含其資料 它包含的是對其資料的引用。當通過值傳遞引用型別的引數時,有可能更改引用所指向的資料,如某類成員的值。但是無法更改引用本身的值 也就是說,不能使用相同的引用為新類分配記憶體並使之在塊外保持。若要這樣做,應使用 ref 或 out 關鍵字傳遞引數。為了簡單起見,下面的示例...