将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

它将尝试匹配最具体的类型, stringobject更具体

根据您的使用情况,您可能应该在object重载中完全删除参数。

这就是C#编译器优先考虑确定哪种方法适合调用的方式。 有一条规则:

如果方法A具有比方法B更多的特定参数类型,则方法A在过载情况下优于方法B.

在你的情况下,显然stringobject更明确,这就是调用LoadTest(string param)原因。

您可以参考7.5.3.2 C#语言规范中的更好的函数成员来获得更多的理解。

因为编译器采用可访问的最接近的特定方法(null到string比null更接近于object)。 在这种情况下,因为与字符串的重载更接近,这就是它被调用的原因。

这就是MSDN所说的

一旦确定了候选函数成员和参数列表,最佳函数成员的选择在所有情况下都是相同的:

  1. 给定一组适用的候选函数成员,找到该集合中的最佳函数成员。

  2. 如果集合只包含一个函数成员,那么该函数成员是最好的函数成员。

  3. 否则,最好的函数成员是一个函数成员,它比给定参数列表中的所有其他函数成员更好,只要使用第7.4.2.2节中的规则将每个函数成员与所有其他函数成员进行比较。

  4. 如果没有一个函数成员优于所有其他函数成员,则函数成员调用不明确并且发生编译时错误。