60

我不明白为什么构造函数是用参数执行的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,它也是一个引用类型。

4

3 回答 3

90

但我不明白为什么没有对象?它也是一个引用类型?

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

特别是,从第 7.5.3.5 节:

给定两种不同类型的 T1 和 T2,如果以下至少一项成立,则 T1 是比 T2 更好的转化目标:

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

这里就是这种情况, where T1isdouble[]T2is object。有从 to 的隐式转换,但没有从double[]toobject的隐式转换objectdouble[]所以double[]是比 . 更好的转换目标object

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

D myD = new D((object) null);
于 2014-02-09T20:52:48.163 回答
19

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

于 2014-02-09T20:54:26.140 回答
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[]。没有从 object 到 double[] 的隐式转换。

于 2014-02-10T04:22:33.030 回答