泛型及約束

2021-09-24 19:32:37 字數 1070 閱讀 6195

程式中經常會用到泛型,如:

class program
,b=.", a, b);
change(ref a, ref b);
console.writeline("after change, a=,b=.", a, b);
console.readkey();
}
static

void change(ref t a, ref t b)

}

但有時候會碰到類似下面的寫法,帶where的:

static

void change2(ref t a, ref t b) where t:struct

剛開始看到未免會比較暈,在msdn上搜尋下,原來是泛型約束,詳細的泛型約束如下:

約束說明

t:struct

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

t:class

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

t:new()

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

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

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

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

所以,在如果要呼叫前面加了約束的函式change2,則必須使用非nullable型別,如int,不能使用string了。

int a = 1;
int b = 2;
console.writeline("before change, a=,b=.", a, b);
change2(ref a, ref b);
console.writeline("after change, a=,b=.", a, b);

泛型型別引數及約束

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

泛型型別引數及約束

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

C 泛型委託及約束

泛型委託 1 namespace 泛型委託216 region 泛型委託 17public static void m1 int msg 1821 public static void m2 double msg 2225 public static void m3 float msg 2629 p...