当我像这样声明一个方法:
void DoWork<T>(T a) { }
void DoWork(int a) { }
并使用以下代码调用:
int a = 1;
DoWork(a);
它会调用哪个
DoWork
方法,为什么?我似乎在MSDN文档中找不到它。它会调用哪个
DoWork
方法以及为什么呢?我在MSDN文档中找不到。当我像这样声明一个方法:
void DoWork<T>(T a) { }
void DoWork(int a) { }
并使用以下代码调用:
int a = 1;
DoWork(a);
DoWork
方法,为什么?我似乎在MSDN文档中找不到它。DoWork
方法以及为什么呢?我在MSDN文档中找不到。正如Eric Lippert所说的:
C#规范指出,当你在调用
ReallyDoIt<string>(string)
和ReallyDoIt(string)
之间做出选择时——也就是说,当两个方法具有相同的签名,但一个通过泛型替换得到该签名时——我们会选择“自然”签名而不是“替代”签名。
更新:
在C#规范(7.5.3)中所述:
当调用泛型方法而没有指定类型参数时,类型推断过程会尝试为调用推断类型参数。通过类型推断,从方法的参数中确定类型参数int。类型推断是方法调用的绑定时间处理的一部分,在调用的重载解析步骤之前进行。
当在方法调用中指定特定的方法组时,并且作为方法调用的一部分未指定类型参数,则将类型推断应用于方法组中的每个泛型方法。如果类型推断成功,则使用推断出的类型参数来确定后续重载决策的参数类型。如果重载决策选择泛型方法作为要调用的方法,则推断出的类型参数将用作调用的实际类型参数。如果特定方法的类型推断失败,则该方法不参与重载决策。DoWork(int)
,另一种是推断出的DoWork<int>(int)
。