将NULL传递给构造函数

时间:2014-02-09 20:50:18

标签: 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");
        }
    }
}

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

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

3 个答案:

答案 0 :(得分:90)

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

是的,double[]object都是引用类型,因此null可以隐式转换为它们。但是,成员重载通常支持更具体的类型,因此使用double[]构造函数。有关更多详细信息,请参阅C#规范的7.5.3节(男孩有很多细节)。

特别是,从第7.5.3.5节:

  

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

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

这就是这种情况,其中T1double[]T2object。这是从double[]object的隐式转换,但没有从objectdouble[]的隐式转换,因此double[]是一个更好的转换目标object

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

D myD = new D((object) null);

答案 1 :(得分:19)

基本上,double[]object,但所有object都是 double[]。由于double[]是更具体的选项,编译器会选择它作为最具体的选项。

答案 2 :(得分:2)

考虑一下:

double[] d = new double[] {};
Console.WriteLine(d is object);//output is True

double [] d是一个对象。

所以考虑一下:

object z = new object[] {};
Console.WriteLine(z is double[]);//output is False

object [] z不是double []。 没有从对象到double []的隐式转换。