generics方法重载的问题

我有以下方法:

void s(int a, tb) { ... .. . } void s(int a, int b) { ... .. . } void s(int a, long b) { ... .. . } 

当我想用它作为s(10,10)我在工具提示中看到了这些覆盖。 s(int a,int b); s(int a,long b); 。 但是,我想我必须看到s(int a,long b);

怎么了 ? 我有visual studio 2008 sp1

谢谢

更新:我在Visual Studio 2010中测试过它。结果是一样的。 更新:它似乎是关于c#而不是visual studio。

您试图直接在通用定义中提供所需的类型参数,但这样做无效。 如果您希望拥有支持(对于第二个参数) int, long, and T类型对象的方法的版本,则声明2个非generics方法重载和一个generics。

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

然后,重载决策将根据参数调用适当的方法,匹配intlong上的完全匹配的非generics版本(如果使用类型参数显式调用它,即使使用intlong参数可以获得generics版本) ,否则获得通用版本。

例子:

 void S(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(10, 10); // uses generic S(10, 10); // uses generic & implicit conversion 

编辑:为了扩展上面简要提到的一点以及注释中的内容, intlong重载的匹配需要精确。 所有其他参数将导致选择通用版本。 如果您没有int想要int重载 ,则需要在方法调用之前或期间显式转换参数。 例如: S(10, (int)myShort);

同样,如果您有两个版本的方法C

 void C(Mammal m) { } void C(T t) { } 

 class Tiger : Mammal { } 

调用C(new Tiger())将导致使用generics方法。 如果您想要Tiger实例的Mammal重载,则需要通过基类进行引用。 如

 Mammal m = new Tiger(); C(m); // uses mammal overload // or Tiger t = new Tiger(); C((Mammal)t); // uses mammal overload