将null值传递给重载方法,其中Object和String作为C#中的param
我有两个重载方法,如下所示
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(); } }
C#编译器可以获得最具体的重载。
由于string
是一个object
,并且它的值可以为null
,因此编译器认为string
更具体。
null
是一个有效的string
。
它将尝试匹配最具体的类型, string
比object
更具体
根据您的使用情况,您可能应该在object
重载中完全删除参数。
这就是C#编译器优先考虑确定哪种方法更适合调用的方式。 有一条规则:
如果方法A具有比方法B更多的特定参数类型,则方法A在过载情况下优于方法B.
在你的情况下,显然string
比object
更明确,这就是调用LoadTest(string param)
原因。
您可以参考7.5.3.2 C#语言规范中的更好的函数成员来获得更多的理解。
因为编译器采用可访问的最接近的特定方法(null到string比null更接近于object)。 在这种情况下,因为与字符串的重载更接近,这就是它被调用的原因。
这就是MSDN所说的
一旦确定了候选函数成员和参数列表,最佳函数成员的选择在所有情况下都是相同的:
给定一组适用的候选函数成员,找到该集合中的最佳函数成员。
如果集合只包含一个函数成员,那么该函数成员是最好的函数成员。
否则,最好的函数成员是一个函数成员,它比给定参数列表中的所有其他函数成员更好,只要使用第7.4.2.2节中的规则将每个函数成员与所有其他函数成员进行比较。
如果没有一个函数成员优于所有其他函数成员,则函数成员调用不明确并且发生编译时错误。