泛型方法重载的问题

本文关键字:问题 重载 泛型方法 | 更新日期: 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)

然后,重载解析将根据参数调用适当的方法,匹配非泛型版本以在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