泛型方法
泛型方法是使用類型參數聲明的方法
static void Swap<T>(ref T lhs ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
類型推斷
相同的類型推斷規則也適用於靜態方法以及實例方法編譯器能夠根據傳入的方法參數推斷類型參數;它無法僅從約束或返回值推斷類型參數因此類型推斷不適用於沒有參數的方法類型推斷在編譯時編譯器嘗試解析任何重載方法簽名之前進行編譯器向共享相同名稱的所有泛型方法應用類型推斷邏輯在重載解析步驟中編譯器僅包括類型推斷取得成功的那些泛型方法
Swap(ref a ref b);
非泛型方法使用泛型參數
在泛型類中非泛型方法可以訪問類級別類型參數
class SampleClass<T>
{
void Swap(ref T lhs ref T rhs) { }
}
泛型類與泛型方法使用相同的泛型參數
如果定義的泛型方法接受與包含類相同的類型參數編譯器將生成警告 CS因為在方法范圍內為內部 T 提供的參數將隱藏為外部 T 提供的參數除了類初始化時提供的類型參數之外如果需要靈活調用具有類型參數的泛型類方法請考慮為方法的類型參數提供其他標識符如下面示例中的 GenericList 所示
class GenericList<T>
{
// CS
void SampleMethod<T>() { }
}
class GenericList<T>
{
//No warning
void SampleMethod<U>() { }
}
泛型約束
使用約束對方法中的類型參數啟用更專門的操作此版本的 Swap 現在稱為 SwapIfGreater它只能與實現 IComparable 的類型參數一起使用
void SwapIfGreater<T>(ref T lhs ref T rhs) where T : SystemIComparable<T>
{
T temp;
if (lhsCompareTo(rhs) > )
{
temp = lhs;
lhs = rhs;
rhs = temp;
}
}
方法重載
泛型方法可以使用許多類型參數進行重載
void DoWork() { }
void DoWork<T>() { }
void DoWork<T U>() { }
From:http://tw.wingwit.com/Article/program/net/201311/13311.html