Передача 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 60

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[] to object, но без неявного преобразования из object к double[], Так что double[] является лучшей целью преобразования, чем object.

если вы хотите принудительно использовать object конструктор, просто cast:

D myD = new D((object) null);

по сути, double[] Это object, а всего objectС неdouble[]s. As double[]Это более конкретный вариант, компилятор выбирает его, как наиболее конкретный.

рассмотрим следующий пример:

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 [] отсутствует.