通用与非通用重载调用

本文关键字:调用 重载 | 更新日期: 2023-09-27 18:29:26

当我声明这样的方法时:

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

用这个称呼它:

int a = 1;
DoWork(a);

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

通用与非通用重载调用

正如Eric Lippert所说:

C#规范规定,当您可以在调用ReallyDoIt<string>(string)ReallyDoIt(string)之间进行选择时——也就是说,当在具有相同签名的两个方法之间进行选择,但其中一个方法通过泛型替换获得该签名时——那么我们选择"自然"签名而不是"替换"签名。

更新:

我们在C#规范(7.5.3)中有什么:

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

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

所以在解决过载之前,我们在方法组中有两个方法。一个CCD_ 5和另一个推断出的CCD_。

我们转到7.5.3.2(更好的功能成员):

在参数类型序列{P1,P2,…,PN}和{Q1,Q2,…,QN}相等的情况下(即,每个Pi具有到对应Qi的恒等式转换),为了确定更好的函数成员,应用以下平局打破规则。1) 如果MP是非通用方法,而MQ是通用方法,则MP优于MQ。