选择哪种C#方法重载?

Par*_*ram 23 .net c# generics

为什么两个重载都匹配时调用泛型方法?

public static void method1(object obj)
{
    Console.WriteLine("Object");
}

public static void method1<T>(T t)
{
    Console.WriteLine("Type T");
}

public static void Main(String args[])
{
    method1("xyz"); //Will print "Type T";
}
Run Code Online (Sandbox Code Playgroud)

这里不应该有任何冲突,对吧?

Eri*_*rik 37

通过选择最具体的过载来解决过载问题.在这种情况下,method1<string>(string)method1(object)所选择的过载更具体.

C#规范的第7.4.2节有详细说明.

如果要选择特定的重载,可以通过将参数显式转换为所需的类型来实现.以下将调用method1(object)重载而不是通用的:

method1((object)"xyz"); 
Run Code Online (Sandbox Code Playgroud)

有些情况下编译器不知道要选择哪个重载,例如:

void method2(string x, object y);
void method2(object x, string y);

method2("xyz", "abc");
Run Code Online (Sandbox Code Playgroud)

在这种情况下,编译器不知道要选择哪个重载,因为两个重载都没有明显优于另一个(它不知道哪个字符串隐式地向下转换为对象).所以它会发出编译器错误.


Vla*_*274 10

C#总是会选择最具体的方法.

编译时

method1("xyz");
Run Code Online (Sandbox Code Playgroud)

它将查找具有指定名称的所有方法,然后尝试匹配参数.编译器将选择最具体的方法,在这种情况下它会更喜欢

method1(string s)
Run Code Online (Sandbox Code Playgroud)

过度

method1<T>(T t) with T = string
Run Code Online (Sandbox Code Playgroud)

最后

method1(object o)
Run Code Online (Sandbox Code Playgroud)

请注意@ Erik对编译器无法确定的示例的出色答案.