Тип нулевого литерала в С#
У меня есть запрос о типе 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 - это строка.
Это может показаться глупым, но я не могу найти регион, почему он вызывает функцию строки.
Ответы
Ответ 1
На ваш вопрос о типе нулевого литерала отвечает: Каков тип нулевого литерала?
Но это не имеет большого значения, когда речь идет о разрешении перегрузки. Фактическое значение null автоматически преобразуется в любой тип, который заканчивается как.
Что касается причины перегрузки string
:
-
Вы не можете передавать null как int
и char
параметры, поскольку они являются типами значений, поэтому эти две перегрузки отсутствуют. (Они могли бы быть кандидатами, если бы вы сделали их обнуляемыми типами int?
и char?
, но я не буду вникать в это.)
-
Между двумя другими перегрузками, использующими ссылочные типы, string
является более конкретным типом, чем object
. То есть, это происходит из (и поэтому неявно конвертируется в) object
. Далее, из следующего раздела в спецификации языка С# (выделение):
7.5.3.5 Лучшая цель преобразования
Учитывая два разных типа T1
и T2
, T1
является лучшей целью преобразования, чем T2
, если выполняется хотя бы одно из следующих условий:
Таким образом, перегрузка 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