泛型方法重载的问题
本文关键字:问题 重载 泛型方法 | 更新日期: 2023-09-27 17:57:27
我有以下方法:
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的。
您正在尝试直接在泛型定义中提供所需的类型参数,这是行不通的。如果您希望方法的版本支持(对于第二个参数(类型 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