我无法理解为什么使用参数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
,它也是一种参考类型。
答案 0 :(得分: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
的隐式转换,但没有从object
到double[]
的隐式转换,因此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 []的隐式转换。