7

I have two overloaded methods like below

 public class TestClass
    {

        public void LoadTest(object param)
        {
            Console.WriteLine("Loading object...");
        }
        public void LoadTest(string param)
        {
            Console.WriteLine("Loading string...");
        }

    }

After calling this method like below it will show the output as Loading string... Please explain how .net handle this scenario?

 class Program
    {
        static void Main(string[] args)
        {       
            var obj=new TestClass();
            obj.LoadTest(null);
           // obj.LoadType(null);
            Console.ReadLine();
        }
    }
4

4 回答 4

5

C# 编译器可能采用最具体的重载。

由于stringobject,并且它可以具有 的值null,编译器认为string更具体。

于 2013-08-19T09:18:16.697 回答
4

null是有效的string

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

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

于 2013-08-19T09:17:03.173 回答
3

这只是 C# 编译器优先确定哪个方法更好调用的方式。有一个规则:

如果方法 A 比方法 B 具有更具体的参数类型,则方法 A在重载情况下优于方法 B。

在您的情况下,显然string比 更指定object,这就是LoadTest(string param)调用的原因。

您可以参考C# 语言规范中的 7.5.3.2 Better function member以获得更多理解。

于 2013-08-19T09:26:31.660 回答
2

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

这就是MSDN要说的

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

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

  2. 如果该集合仅包含一个函数成员,则该函数成员是最佳函数成员。

  3. 否则,如果使用第 7.4.2.2 节中的规则将每个函数成员与所有其他函数成员进行比较,则最佳函数成员是在给定参数列表方面优于所有其他函数成员的一个函数成员。

  4. 如果没有一个函数成员比所有其他函数成员更好,那么函数成员调用是不明确的,并且会发生编译时错误。

于 2013-08-19T09:16:58.733 回答