c# - 通用与非通用重载调用

标签 c# generics .net-4.0 overloading

当我这样声明一个方法时:

void DoWork<T>(T a) { }
void DoWork(int a) { }

然后这样调用它:

int a = 1;
DoWork(a);

它会调用什么 DoWork 方法,为什么?我似乎无法在任何 MSDN 文档中找到它。

最佳答案

作为埃里克·利珀特 says :

The C# specification says that when you have a choice between calling ReallyDoIt<string>(string) and ReallyDoIt(string) – that is, when the choice is between two methods that have identical signatures, but one gets that signature via generic substitution – then we pick the “natural” signature over the “substituted” signature.

更新:

C# 规范 (7.5.3) 中的内容:

当在没有指定类型参数的情况下调用泛型方法时,类型推断过程会尝试为调用推断类型参数。通过类型推断,类型参数 int 由方法的参数确定。类型推断作为方法调用的绑定(bind)时间处理的一部分发生并发生 before调用的重载解决步骤。

当在方法调用中指定了一个特定的方法组,并且没有类型参数被指定为方法调用的一部分时,类型推断将应用于方法组中的每个泛型方法。如果类型推断成功,则推断出的类型参数用于确定后续重载决策的参数类型。如果重载决策选择一个泛型方法作为要调用的方法,则推断的类型参数将用作调用的实际类型参数。如果特定方法的类型推断失败,则该方法不参与重载决议。

所以在重载决议之前我们在方法组中有两个方法。一DoWork(int)和其他推断DoWork<int>(int) .

然后我们转到 7.5.3.2(更好的函数成员):

如果参数类型序列 {P1, P2, …, PN} 和 {Q1, Q2, …, QN} 是等价的(即每个 Pi 都有一个到对应 Qi 的身份转换),下面的平分规则按顺序应用,以确定更好的函数成员。 1)如果 MP 是非泛型方法,MQ 是泛型方法,则 MP 优于 MQ。

关于c# - 通用与非通用重载调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9922202/

相关文章:

c# - 在 MVVM 中传递服务

c# - Unity/HoloLens 确定角度的分色

c# - 泛型和 LINQ to XML

.net - 代码契约 Vs。对象初始值设定项 (.net 4.0)

c# - 使用延迟进行请求限制有哪些缺点(C# .Net 4 Web Server)

c# - 计算公差值

C# ShortCut 路径修改

带有抽象方法的Java继承

c# - 如何使用通用搜索获取实体列表

c# - 特定于 ASP.NET Web API 中的 Controller 的自定义委托(delegate)处理程序