我有两个重载方法,如下面的
public class TestClass
{
public void LoadTest(object param)
{
Console.WriteLine("Loading object...");
}
public void LoadTest(string param)
{
Console.WriteLine("Loading string...");
}
}
在调用此方法后,它会将输出显示为加载字符串... 请解释.net如何处理此方案?
class Program
{
static void Main(string[] args)
{
var obj=new TestClass();
obj.LoadTest(null);
// obj.LoadType(null);
Console.ReadLine();
}
}
答案 0 :(得分:4)
null
是有效的string
。
它会尝试匹配最具体的类型,string
比object
更具体
根据您的使用情况,您可能应该在object
重载中完全删除参数。
答案 1 :(得分:4)
C#编译器可以获得最具体的重载。
由于string
是object
,并且其值null
,编译器会认为string
更具体。
答案 2 :(得分:3)
这就是C#编译器优先考虑确定哪个方法更好来调用的方式。有一条规则:
如果方法A具有比方法B更多的特定参数类型,则方法A在重载情况下
在您的情况下,显然string
的指定比object
更明确,这就是调用LoadTest(string param)
的原因。
您可以参考C# language specification中的7.5.3.2更好的功能成员来获得更多的理解。
答案 3 :(得分:2)
因为编译器采用可访问的最接近的特定方法(null到string比null更接近于object)。在这种情况下,因为与字符串的重载更接近,这就是它被调用的原因。
这是MSDN所说的
一旦确定了候选函数成员和参数列表,最佳函数成员的选择就相同了 所有情况:
给定适用的候选函数成员集,该集合中的最佳函数成员位于。
如果集合只包含一个函数成员,那么该函数成员是最好的函数成员。
否则,最好的函数成员是一个函数成员,它比给定的所有其他函数成员更好 参数列表,只要将每个函数成员与所有函数成员进行比较 其他函数成员使用第7.4.2.2节中的规则。
- 醇>
如果没有一个函数成员优于所有其他函数成员,那么函数成员调用是 模糊不清,发生编译时错误。