Передача 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 True
double[] d-это объект.
Итак, рассмотрим это:
object z = new object[] {}; Console.WriteLine(z is double[]);//output is False
object [] z не являются двойными[]. Неявное преобразование объекта в double [] отсутствует.