Хтось сказав у цій дискусійній темі, що ви не можете зробити рядок із нічого.
(яка приємна фраза, як я думаю). Але так - ви можете :-), як показано в наступному прикладі:
var x = null + (string)null;
var wtf = x.ToString();
працює чудово і зовсім не кидає виняток. Єдина відмінність полягає в тому, що вам потрібно ввести один з нулів у рядок - якщо ви видалите (рядок) каст, то приклад все-таки компілюється, але викидає виняток під час виконання: "Оператор '+" неоднозначний для операндів введіть '<null>' та '<null>' ".
Примітка. У наведеному вище прикладі коду значення x не є нульовим, як ви могли очікувати, це фактично порожній рядок після того, як ви вкинули один із операндів у рядок.
Ще один цікавий факт полягає в тому, що в C # / .NET спосіб null
трактування не завжди однаковий, якщо враховувати різні типи даних. Наприклад:
int? x = 1; // string x = "1";
x = x + null + null;
Console.WriteLine((x==null) ? "<null>" : x.ToString());
Щодо 1-го рядка фрагмента коду: Якщо x
є нульова ціла змінна (тобто int?
), що містить значення 1
, то ви отримуєте результат <null>
назад. Якщо це рядок (як показано в коментарі) зі значенням "1"
, то ви отримуєте "1"
назад, а не <null>
.
NB Також цікаво: якщо ви використовуєте var x = 1;
для першого рядка, ви отримуєте помилку виконання. Чому? Тому що призначення перетворить змінну x
в тип даних int
, який не зводиться до нуля. Тут компілятор не передбачає int?
, а значить, не працює у другому рядку, де null
додано.
null.ToString()
дано ім’яwtf
. Чому це вас дивує? Ви не можете викликати метод екземпляра, коли вам нічого не потрібно викликати.