gpt4 book ai didi

c# - 泛型方法重载和优先级

转载 作者:太空狗 更新时间:2023-10-29 23:00:13 25 4
gpt4 key购买 nike

我有两个重载的泛型方法:

T Foo<T>(T t) { Console.WriteLine("T"); return t; }

T Foo<T>(int i) { Console.WriteLine("int"); return default(T); }

当我尝试在我的计算机上调用 Foo 时:

Foo(5);

我没有收到任何编译器错误或警告,并且调用了具有通用参数的 first 方法(即输出为 T)。 在所有 C# 版本和所有平台上都会出现这种情况吗?在那种情况下,为什么?

另一方面,如果我在泛型调用中明确指定类型:

Foo<int>(5);

带有 int 参数的 second 方法被调用,即输出现在是 int为什么?

我在我的两个方法重载中使用了不同的参数名称,因此以下调用的输出符合预期:

Foo<int>(t: 5);       // output 'T'
Foo<int>(i: 5); // output 'int'

如果我调用第一个方法,我什至可以省略类型说明:

Foo(t: 5);            // output 'T'

但是如果我尝试编译这个:

Foo(i: 5);

我得到一个错误无法从用法中推断出方法“Foo(int)”的类型参数。尝试显式指定类型参数。 为什么编译器无法处理此调用?

注意这些测试是在 Windows 8 x64 系统上使用 LinqPad 执行的(以防与结果相关...)

最佳答案

最后一个问题

由于您指定(通过参数名称)它应该调用采用 int 的重载参数,编译器不知道要为 T 传递什么.

第一个问题

因此,Foo(5) 只匹配一个重载 ( Foo<T>() )。
因此,它只能调用 Foo<T>() .

第二个问题

当您显式指定类型参数 ( <int> ) 时,两种重载都适用。
在这种情况下,Foo(int)更好,因为它的参数不是通用类型。

根据 C# 规范 §7.5.3.2:

  • Otherwise, if MP has more specific parameter types than MQ, then MP is better than MQ. Let {R1, R2, …, RN} and {S1, S2, …, SN} represent the uninstantiated and unexpanded parameter types of MP and MQ. MP’s parameter types are more specific than MQ’s if, for each parameter, RX is not less specific than SX, and, for at least one parameter, RX is more specific than SX:
    • A type parameter is less specific than a non-type parameter.

(强调)

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

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