将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的隐式转换
在这里, T1
是double[]
, T2
是object
。 有一个从double[]
到object
隐式转换,但没有从object
到double[]
隐式转换,所以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 []的隐式转换。