将null值传递给重载方法,其中Object和String为C#中的param

时间:2013-08-19 09:12:12

标签: c# .net

我有两个重载方法,如下面的

 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();
        }
    }

4 个答案:

答案 0 :(得分:4)

null是有效的string

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

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

答案 1 :(得分:4)

C#编译器可以获得最具体的重载。

由于stringobject,并且其值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所说的

  
    

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

  
     
      
  1. 给定适用的候选函数成员集,该集合中的最佳函数成员位于。

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

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

  6.   
  7. 如果没有一个函数成员优于所有其他函数成员,那么函数成员调用是   模糊不清,发生编译时错误。

  8.