Передача 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");
}
}
}
Я думаю, потому что первый конструктор принимает параметр ссылочного типа. Первый конструктор со ссылочным параметром потому что null значение по умолчанию для ссылочных типов.
но я не понимаю, почему не object, Это также ссылочный тип.
3 ответа:
но я не могу понять, почему не объект? Это также ссылочный тип?
да, как
double[]иobjectявляются ссылочными типами, поэтомуnullнеявно конвертируется в них обоих. Однако перегрузка членов обычно благоприятствует более конкретным типам, поэтому конструктор. См. раздел 7.5.3 спецификации C# для получения более подробной информации (и мальчик есть много деталей).в частности, из раздела 7.5.3.5:
учитывая два разных типа T1 и T2, T1 является лучшей целью преобразования, чем T2, если выполняется хотя бы одно из следующих условий:
- неявное преобразование из T1 в T2 существует, и неявное преобразование из T2 в T1 не существует
вот так здесь, где
T1иdouble[]иT2иobject. Есть неявное преобразование изdouble[]toobject, но без неявного преобразования изobjectкdouble[], Так чтоdouble[]является лучшей целью преобразования, чемobject.если вы хотите принудительно использовать
objectконструктор, просто cast:D myD = new D((object) null);
по сути,
double[]Этоobject, а всегоobjectС неdouble[]s. Asdouble[]Это более конкретный вариант, компилятор выбирает его, как наиболее конкретный.
рассмотрим следующий пример:
double[] d = new double[] {}; Console.WriteLine(d is object);//output is Truedouble[] d-это объект.
Итак, рассмотрим это:
object z = new object[] {}; Console.WriteLine(z is double[]);//output is Falseobject [] z не являются двойными[]. Неявное преобразование объекта в double [] отсутствует.