Dim*_*zyr 60 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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为因为第一个构造函数采用引用类型的参数.带引号参数的第一个构造函数因为null是引用类型的默认值.
但我不明白为什么不object,它也是一个参考类型.
Jon*_*eet 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);
Run Code Online (Sandbox Code Playgroud)