2011-05-23 159 views
2

我有以下方法的問題:與泛型方法重載

void s<t>(int a, t b) 
{ 
    ... 
    .. 
    . 
} 

void s<int>(int a, int b) 
{ 
    ... 
    .. 
    . 
} 

void s<long>(int a, long b) 
{ 
    ... 
    .. 
    . 
} 
當我想用它作爲 s<long>(10,10)我看到這些提示覆蓋

s<long>(int a,int b);ands<long>(int a,long b);。但是,我想我只能看到s<long>(int a,long b);

怎麼了?我有visual studio 2008 sp1

感謝

更新:我測試在Visual Studio 2010.The結果是一樣的。 更新:它似乎是關於C#不Visual Studio。

+1

'int's可以自動提升爲'long's,所以這是正確的行爲。 – porges 2011-05-23 05:29:54

+4

這些不是重寫 - 它們是重載。而且你不要聲明這樣的通用方法... – 2011-05-23 05:36:10

+0

哦,是的,overload.sorry: - > – Saleh 2011-05-23 06:24:59

回答

2

您正試圖直接在泛型定義中提供所需的類型參數,這不會起作用。如果您希望支持(第二個參數)int, long, and T類型對象的方法版本,則聲明2個非泛型方法重載和一個泛型。然後

void S(int a, int b) 
void S(int a, long b) 
void S<T>(int a, T b) 

重載決策將調用基於參數的適當的方法,對intlong(匹配的非通用版本完全匹配您可以獲得通用版本即使有intlong參數,如果你使用類型參數顯式調用它),否則獲取通用版本。

例子:

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 

編輯:要在在評論上述簡要進一步提到一個點擴大,比賽爲intlong重載的需求準確地爲所有其他參數將導致選擇通用版本。如果沒有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 
+2

這是正確的方法,但你仍然必須小心。例如,假設你調用S(10,myShort)。哪種更好,泛型,整型還是長版?很多人都認爲「短到int,所以int版本更好」,但實際上正確的答案是S 完全匹配*,int和long版本是不精確的匹配,所以通用版本獲勝。 – 2011-05-24 15:35:28