泛型方法重载的问题

时间:2011-05-23 05:18:40

标签: c# generics methods overloading

我有以下方法:

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。

1 个答案:

答案 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)

然后,重载决策将根据参数调用适当的方法,匹配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重载的匹配需要 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