Подтвердить что ты не робот

Тип нулевого литерала в С#

У меня есть запрос о типе null.
У меня есть небольшая программа, кто-нибудь может рассказать мне об этом.

public class TestApplication
{
    public void ShowText(object  ob)
    {
        Console.Write("Inside object");
    }
    public void ShowText(string str)
    {
        Console.Write("Inside string");
    }
    public void ShowText(int i)
    {
        Console.Write("Inside int.");
    }
    public void ShowText(char c)
    {
        Console.Write("Inside Character");
    }
    static void Main(string[] args)
    {
        new TestApplication().ShowText(null);            
        Console.Read();
    }
}

Почему он вызывает строковую функцию.
Это означает, что тип null - это строка.
Это может показаться глупым, но я не могу найти регион, почему он вызывает функцию строки.

4b9b3361

Ответ 1

На ваш вопрос о типе нулевого литерала отвечает: Каков тип нулевого литерала?

Но это не имеет большого значения, когда речь идет о разрешении перегрузки. Фактическое значение null автоматически преобразуется в любой тип, который заканчивается как.

Что касается причины перегрузки string:

  • Вы не можете передавать null как int и char параметры, поскольку они являются типами значений, поэтому эти две перегрузки отсутствуют. (Они могли бы быть кандидатами, если бы вы сделали их обнуляемыми типами int? и char?, но я не буду вникать в это.)

  • Между двумя другими перегрузками, использующими ссылочные типы, string является более конкретным типом, чем object. То есть, это происходит из (и поэтому неявно конвертируется в) object. Далее, из следующего раздела в спецификации языка С# (выделение):

    7.5.3.5 Лучшая цель преобразования

    Учитывая два разных типа T1 и T2, T1 является лучшей целью преобразования, чем T2, если выполняется хотя бы одно из следующих условий:

    • Неявное преобразование из T1 в T2 существует, и неявное преобразование из T2 в T1 существует

    • ...

Таким образом, перегрузка string выбирается наилучшим образом.

Ответ 2

null может соответствовать любому ссылочному типу. и, следовательно, является очень хорошим примером полиморфизма.

позволяет сказать, что у вас есть класс Vehicle. вы создаете еще три класса Two-Wheeler, Three-Wheeler, Four-Wheeler.

если последний класс 3 класса extends Vehicle; он называется Vehicle, указывается в эти три категории.

Таким образом, учитывая значение, скажем, автомобиль, более конкретное значение соответствует этому значению Four-Wheeler.

Аналогично в случае null. он может соответствовать либо Object OR String; но более конкретное соответствие - String.

Давайте посмотрим, как компилятор думает (только для вашего кода), когда видит вызов метода ShowText(null)

  • Найти метод ShowText.
  • О, я нашел 4 метода, которые можно назвать?!!
  • Давайте посмотрим, какой аргумент передан, hmm.. it null.
  • Найти метод ShowText, который имеет ссылочный тип в качестве аргумента. все перегрузки с примитивными аргументами игнорируются.
  • О нет... я могу сопоставить его с eithe String ИЛИ Object.
  • Что более конкретно. i.e, который сначала входит в иерархию наследования снизу.
  • Hurray.. нашел его.. it String.. позволяет называть его.

И для упражнения, если вы хотите отказаться от того, что произойдет, если компилятор найдет на шаге 6 более одного совпадения... определите ShowText (string [] vals) и посмотрите сами.

Ответ 3

Это пример разрешения перегрузки в С#, это не доказывает, что тип null является строкой.

null - это специальное значение, которое включено в домен любого ссылочного типа, оно в основном определяет, что ссылки не действительны. Таким образом, это могут быть string, int?, an object и т.д. И т.д.

Вы даже можете использовать null для любого ссылочного типа, чтобы получить "правильно" напечатанный null, например. вы должны указать значение null, если оно используется как значение в операторе ?

int? value = (i > 0) ? i : null; // does not compile
int? value = (i > 0) ? i : (int?)null; //works