我有以下方法:
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);
和 s<long>(int a,long b);
。但是,我认为我必须看到s<long>(int a,long b);
。
怎么了?我有 visual studio 2008 sp1 。
由于
更新:我在Visual Studio 2010中对其进行了测试。结果是一样的。 更新:似乎是关于c#而不是visual studio。
答案 0 :(得分: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)
然后,重载决策将根据参数调用适当的方法,匹配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
重载的匹配需要 exact。 所有其他参数都将导致选择通用版本。如果没有int 但想要int重载,则需要在方法调用之前或期间显式转换参数。例如:S(10, (int)myShort);
。
同样,如果您有两个版本的方法C
void C(Mammal m) { }
void C<T>(T t) { }
带
class Tiger : Mammal { }
调用C(new Tiger())
将导致使用泛型方法。如果您希望Mammal
实例的Tiger
重载,则需要通过基类进行引用。如
Mammal m = new Tiger();
C(m); // uses mammal overload
// or
Tiger t = new Tiger();
C((Mammal)t); // uses mammal overload