Кто-то сказал в этой ветке обсуждения, что вы не можете сделать строку из ничего.
(что, на мой взгляд, хорошая фраза). Но да - вы можете :-), как показывает следующий пример:
var x = null + (string)null;
var wtf = x.ToString();
отлично работает и вообще не вызывает исключения. Единственное отличие состоит в том, что вам нужно преобразовать один из нулей в строку - если вы удалите приведение (string) , то пример все равно компилируется, но выдает исключение времени выполнения: «Оператор '+' неоднозначен для операндов введите '<null>' и '<null>' ".
NB. В приведенном выше примере кода значение x не равно нулю, как вы могли ожидать, это фактически пустая строка после преобразования одного из операндов в строку.
Другой интересный факт заключается в том, что в C # / .NET способ null
обработки не всегда одинаков, если рассматривать разные типы данных. Например:
int? x = 1; // string x = "1";
x = x + null + null;
Console.WriteLine((x==null) ? "<null>" : x.ToString());
Что касается 1-й строки фрагмента кода: если x
это целочисленная переменная, допускающая значение NULL (т. Е. int?
), Содержащая значение 1
, то вы получаете результат <null>
обратно. Если это строка (как показано в комментарии) со значением "1"
, то вы "1"
скорее возвращаетесь, чем <null>
.
NB Также интересно: если вы используете var x = 1;
для первой строки, вы получаете ошибку времени выполнения. Зачем? Поскольку присвоение превратит переменную x
в тип данных int
, который не допускает значения NULL. Компилятор здесь не предполагает int?
, и, следовательно, не работает во второй строке, где null
добавлено.
null.ToString()
дали имяwtf
. Почему это вас удивляет? Вы не можете вызвать метод экземпляра, если вам не из чего его вызывать.