c 泛型型別引數與約束的深入分析

2022-09-26 09:21:11 字數 1873 閱讀 5202

泛型型別引數簡介

在定義泛型型別和泛型方法時,常用到泛型型別引數,泛型型別引數是在例項化泛型時指定njngdg型別的佔位符。泛型型別引數放在「<>」內。

泛型型別引數命名建議:

(1)當泛型型別引數為單個字母時,建議用t表示。

(2)當泛型型別引數用單詞定義時,建議在單詞前加t。

複製** **如下:

private void promptname(t t) {}

private void promptname(tuser user){}

泛型型別引數約束

在定義泛型類時,可以對在例項化泛型類時用於型別引數的型別種類施加限制。如果例項化泛型類時使用某個約束所不允許的型別來例項化類,則會產生編譯時錯誤。

泛型約束分類:

約束說明

t:結構

型別引數必須是值型別。 可以指定除 nullable 以外的任何值型別。

t:類型別引數必須是引用型別;這一點也適用於任何類、介面、委託或陣列型別。

t:new()

型別引數必須具有無引數的公共建構函式。 當與其他約束一起使用時,new()約束必須最後指定。

t:基類名》

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

t:介面名稱》

www.cppcns.com

型別引數必須是指定的介面或實現指定的介面。 可以指定多個介面約束。 約束介面也可以是泛型的。

t:u為 t 提供的型別引數必須是為 u 提供的引數或派生自為 u 提供的引數。

(1)型別引數約束為結構(struct)。

複製** **如下:

public class showobjecttype where t : struct

}class genericconstraint

}(2)型別引數約束為類(class)。

在應用 where t : class 約束時,避免對型別引數使用 == 和 != 運算子,因為這些運算子僅測試型別為引用型別,而不測試值相等性。

複製** **如下:

class genericconstraint

private static void addclass(list list, t t) where t : class

}(3)型別引數約束為具體類。

約束為具體類時,可利用型別引數呼叫具體類的屬性和方法。

複製** **如下:

class genericconstraint

;promptname(person);

&nb程式設計客棧sp;     cnjngdgonsole.read();

}//此約束t為person物件或者繼承person物件

private static void promptname(t t) where t : person

string name = t.getname();

console.writeline("person name is ", name);}}

public class person

set

}private string name;

public string name

set

}public string getname()

}(4)約束多個引數。

複製** **如下:

class base

class test

where u : struct

where t : base, new()

(5)未繫結型別引數。

沒有約束的型別引數,稱為未繫結的型別引數。

複製** **如下:

class  list{}

本文標題: c# 泛型型別引數與約束的深入分析

本文位址:

泛型型別引數的約束

泛型型別引數的約束 在定義泛型類時,可以對客戶端 能夠在例項化類時用於型別引數的型別種類施加限制。如果客戶端 嘗試使用某個約束所不允許的型別來例項化類,則會產生編譯時錯誤。這些限制稱為約束。約束是使用where上下文關鍵字指定的。下表列出了六種型別的約束 約束 說明 t 結構 型別引數必須是值型別。...

泛型型別的引數約束

t 結構 型別引數必須是值型別。可以指定除 nullable 以外的任何值型別。t 類 型別引數必須是引用型別 這一點也適用於任何類 介面 委託或陣列型別。t new 型別引數必須具有無引數的公共建構函式。當與其他約束一起使用時,new 約束必須最後指定。t 基類名 型別引數必須是指定的基類或派生自...

泛型型別引數及約束

泛型型別引數簡介 在定義泛型型別和泛型方法時,常用到泛型型別引數,泛型型別引數是在例項化泛型時指定型別的佔位符。泛型型別引數放在 內。泛型型別引數命名建議 1 當泛型型別引數為單個字母時,建議用t表示。1 當泛型型別引數用單詞定義時,建議在單詞前加t。private void promptname ...