泛型方法是使用類型參數宣告的方法,如下所示:
static void Swap<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
下列程式代碼範例示範使用 型別自變數呼叫 方法 int
的一種方式:
public static void TestSwap()
{
int a = 1;
int b = 2;
Swap<int>(ref a, ref b);
System.Console.WriteLine(a + " " + b);
}
您也可以省略類型自變數,編譯程式會推斷它。 下列呼叫 Swap
相當於先前的呼叫:
Swap(ref a, ref b);
類型推斷的相同規則適用於靜態方法和實例方法。 編譯程式可以根據您傳入的方法自變數來推斷類型參數;它無法只從條件約束或傳回值推斷類型參數。 因此,類型推斷不適用於沒有參數的方法。 在編譯階段,編譯程式嘗試解析多載的方法簽章之前,就會發生類型推斷。 編譯程式會將類型推斷邏輯套用至所有共用相同名稱的泛型方法。 在多載解析步驟中,編譯器僅考慮類型推斷成功的泛型方法。
在泛型類別中,非泛型方法可以存取類別層級類型參數,如下所示:
class SampleClass<T>
{
void Swap(ref T lhs, ref T rhs) { }
}
如果您定義採用與包含類別相同的型別參數的泛型方法,編譯程式會產生警告 CS0693 ,因為在方法範圍內,內部 T
提供的自變數會隱藏為外部 T
提供的自變數。 如果您需要在具現化類別時使用不同於原提供類型參數的方式來呼叫泛型類別方法,請考慮為方法的類型參數提供另一個識別符,如 GenericList2<T>
中的下列範例所示。
class GenericList<T>
{
// CS0693.
void SampleMethod<T>() { }
}
class GenericList2<T>
{
// No warning.
void SampleMethod<U>() { }
}
使用約束條件,在方法中啟用類型參數的更精確的操作。 這個版本的 Swap<T>
,現在名為 SwapIfGreater<T>
,只能與那些實踐 IComparable<T>的類型參數一起使用。
void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable<T>
{
T temp;
if (lhs.CompareTo(rhs) > 0)
{
temp = lhs;
lhs = rhs;
rhs = temp;
}
}
泛型方法可以在多個類型參數上重載。 例如,下列方法全都可以位於相同的類別中:
void DoWork() { }
void DoWork<T>() { }
void DoWork<T, U>() { }
您也可以使用 type 參數作為方法的傳回型別。 下列程式碼範例展示傳回T
類型陣列的方法:
T[] Swap<T>(T a, T b)
{
return [b, a];
}
C# 語言規格
如需詳細資訊,請參閱<C# 語言規格>。