将NULL传递给构造函数

我不明白为什么构造函数与参数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"); } } } 

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

但我不明白为什么不object ,这也是一个参考types。

但我不明白为什么没有对象? 这也是一个参考types?

是的, double[]object都是引用types,所以null可以隐式转换为它们两个。 但是,成员重载通常更喜欢更具体的types,所以使用double[]构造函数。 有关更多详细信息,请参见C#规范的第7.5.3节(和男孩有很多细节)。

特别是从7.5.3.5节开始:

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

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

在这里, T1double[]T2object 。 有一个从double[]object隐式转换,但没有从objectdouble[]隐式转换,所以double[]是比object更好的转换目标。

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

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

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

考虑一下:

 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 []的隐式转换。