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

本文关键字:作为 String 参数 Object 其中 值传 null 重载 方法 | 更新日期: 2023-09-27 18:28:05

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

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

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

C#编译器尽可能采用最特定的重载。

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

null是有效的string

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

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

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

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

在您的情况下,显然stringobject更具体,这就是调用LoadTest(string param)的原因。

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

因为编译器采用了最接近的可用特定方法(null到字符串比null到对象更接近)。在这种情况下,由于字符串重载越接近,所以调用它。

这就是MSDN要说的

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

  1. 给定一组适用的候选功能成员,即可定位该组中的最佳功能成员。

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

  3. 否则,最好的函数成员是在给定函数方面比所有其他函数成员都好的一个函数成员参数列表,前提是将每个函数成员与所有使用第7.4.2.2节中规则的其他功能成员。

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