将NULL传递给构造函数

Dim*_*zyr 60 c# constructor overloading constructor-overloading

我无法理解为什么使用参数执行构造函数Double[]

using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            D myD = new D(null);
            Console.ReadLine();           
        }

    }

    public class D
    {
        public D(object o)
        {
            Console.WriteLine("Object");
        }
        public D(double[] array)
        {
            Console.WriteLine("Array");
        }
        public D(int i)
        {
            Console.WriteLine("Int");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为因为第一个构造函数采用引用类型的参数.带引号参数的第一个构造函数因为null是引用类型的默认值.

但我不明白为什么不object,它也是一个参考类型.

Jon*_*eet 90

但我无法理解为什么没有对象?它也是一种参考类型?

是的,无论是double[]object是引用类型,所以null隐式转换为两者.但是,成员重载通常偏向于更具体的类型,因此使用double[]构造函数.有关更多详细信息,请参阅C#规范的7.5.3节(男孩有很多细节).

特别是,从第7.5.3.5节:

给定两种不同类型T1和T2,如果至少有以下一种情况,则T1是比T2更好的转换目标:

  • 存在从T1到T2的隐式转换,并且不存在从T2到T1的隐式转换

这就是这种情况,T1现在double[]T2将来object.有从隐式转换double[]object,但是从没有隐式转换objectdouble[],所以double[]是不是更好的转换目标object.

如果你想强制使用object构造函数,只需强制转换:

D myD = new D((object) null);
Run Code Online (Sandbox Code Playgroud)

  • @KhaledAKhunaifer:是的,所以如果带有'double []`*的重载不存在,它会调用带有`object`的重载 - 但是因为带有`double []`的重载比重载'更具体.对象`,这是被挑选的那个. (3认同)

It'*_*ie. 19

基本上,double[]是一个object,但所有objects 都不 double[]是.作为double[]更具体的选项,编译器选择它作为最具体的选项.