您正試圖直接在泛型定義中提供所需的類型參數,這不會起作用。如果您希望支持(第二個參數)int, long, and T
類型對象的方法版本,則聲明2個非泛型方法重載和一個泛型。然後
void S(int a, int b)
void S(int a, long b)
void S<T>(int a, T b)
重載決策將調用基於參數的適當的方法,對int
或long
(匹配的非通用版本完全匹配您可以獲得通用版本即使有int
或long
參數,如果你使用類型參數顯式調用它),否則獲取通用版本。
例子:
void S<T>(int a, T b)
{
Console.WriteLine("generic method");
}
void S(int a, int b)
{
Console.WriteLine("int overload");
}
void S(int a, long b)
{
Console.WriteLine("long overload");
}
...
S(10, 10);
S(10, (long)10);
S(10, 10L);
S(10, 10M);
S<int>(10, 10); // uses generic
S<long>(10, 10); // uses generic & implicit conversion
編輯:要在在評論上述簡要進一步提到一個點擴大,比賽爲int
和long
重載的需求準確地爲。所有其他參數將導致選擇通用版本。如果沒有int,但需要int超載,則需要在方法調用之前或期間顯式轉換參數。例如:S(10, (int)myShort);
。
同樣,如果你有方法C
void C(Mammal m) { }
void C<T>(T t) { }
的兩個版本
class Tiger : Mammal { }
調用C(new Tiger())
將導致正在使用的通用方法。如果您想爲Tiger
實例重載Mammal
,則需要通過基類進行引用。如
Mammal m = new Tiger();
C(m); // uses mammal overload
// or
Tiger t = new Tiger();
C((Mammal)t); // uses mammal overload
'int's可以自動提升爲'long's,所以這是正確的行爲。 – porges 2011-05-23 05:29:54
這些不是重寫 - 它們是重載。而且你不要聲明這樣的通用方法... – 2011-05-23 05:36:10
哦,是的,overload.sorry: - > – Saleh 2011-05-23 06:24:59