为什么两个重载都匹配时调用泛型方法?
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对编译器无法确定的示例的出色答案.
| 归档时间: |
|
| 查看次数: |
3386 次 |
| 最近记录: |