泛型方法重载的问题

发布于 2024-11-09 06:35:31 字数 616 浏览 1 评论 0原文

我有以下方法:

void s<t>(int a, t b)
{
    ...
    ..
    .
}

void s<int>(int a, int b)
{
    ...
    ..
    .
}

void s<long>(int a, long b)
{
    ...
    ..
    .
}

当我想将其用作 s(10,10) 时,我会在工具提示中看到这些覆盖。 s(int a,int b); s(int a,long b);。但是,我想我必须只看到 s(int a,long b);

怎么了 ?我有Visual Studio 2008 sp1

谢谢

更新: 我已经在 Visual Studio 2010 中测试了它。结果是相同的。 更新:它似乎是关于 c# 而不是 Visual Studio。

I have the following methods:

void s<t>(int a, t b)
{
    ...
    ..
    .
}

void s<int>(int a, int b)
{
    ...
    ..
    .
}

void s<long>(int a, long b)
{
    ...
    ..
    .
}

when I want to use it as s<long>(10,10) I see these overrides in tooltip.
s<long>(int a,int b); and s<long>(int a,long b);. But, I think i must see just s<long>(int a,long b);.

What's wrong ? I have visual studio 2008 sp1.

Thanks

Update : I have test it in Visual Studio 2010.The result is the same.
Update : It seems it is about c# not visual studio.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

弃爱 2024-11-16 06:35:31

您试图直接在泛型定义中提供所需的类型参数,这是行不通的。如果您希望该方法的版本支持(对于第二个参数)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 重载的匹配需要准确。所有其他参数都将导致选择通用版本。如果您没有 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

You are trying to provide the type parameters you want in the generic definition directly, which is not going to work. If you wish to have versions of the method that support (for the second parameter) objects of type int, long, and T, declare 2 non-generic method overloads and one generic.

void S(int a, int b)
void S(int a, long b)
void S<T>(int a, T b)

Overload resolution will then call the appropriate method based on the arguments, matching the non-generic versions for exact matches on int or long (you can get the generic version even with a int or long parameter if you explicitly invoke it using a type parameter), otherwise getting the generic version.

Examples:

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

Edit: To expand upon a point mentioned briefly above and further in the comments, the match for the int and long overloads needs to be exact. All other arguments will result in the selection of the generic version. If you do not have an int but want the int overload, you will need to explicitly convert the argument prior to or during the method invocation. ex: S(10, (int)myShort);.

Similarly, if you have two versions of method C

void C(Mammal m) { }
void C<T>(T t) { }

with

class Tiger : Mammal { }

The invocation C(new Tiger()) will result in the generic method being used. If you want the Mammal overload for the Tiger instance, you need a reference via the base class. Such as

Mammal m = new Tiger();
C(m); // uses mammal overload
// or 
Tiger t = new Tiger();
C((Mammal)t); // uses mammal overload
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文