gpt4 book ai didi

c# - 泛型方法重载的问题

转载 作者:太空宇宙 更新时间:2023-11-03 11:36:33 24 4
gpt4 key购买 nike

我有以下方法:

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 和 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()) 将导致使用通用方法。如果您想要 Tiger 实例的 Mammal 重载,您需要通过基类进行引用。比如

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

关于c# - 泛型方法重载的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6093112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com