Ktoś powiedział w tym wątku dyskusyjnym, że nie można stworzyć łańcucha z niczego.
(co wydaje mi się miłe). Ale tak - możesz :-), jak pokazuje poniższy przykład:
var x = null + (string)null;
var wtf = x.ToString();
działa dobrze i wcale nie zgłasza wyjątku. Jedyną różnicą jest to, że musisz rzutować jedną z wartości null na łańcuch - jeśli usuniesz rzutowanie (string) , przykład nadal się kompiluje, ale generuje wyjątek w czasie wykonywania: „Operator '+' jest niejednoznaczny dla operandów wpisz „<null>” i „<null>” ”.
NB W powyższym przykładzie kodu wartość x nie jest zerowa, jak można by się spodziewać, jest to w rzeczywistości pusty ciąg po rzutowaniu jednego z operandów na łańcuch.
Innym interesującym faktem jest to, że w C # / .NET sposób nulltraktowania nie zawsze jest taki sam, jeśli wziąć pod uwagę różne typy danych. Na przykład:
int? x = 1; // string x = "1";
x = x + null + null;
Console.WriteLine((x==null) ? "<null>" : x.ToString());
Odnośnie pierwszego wiersza fragmentu kodu: jeśli xjest zmienną całkowitą dopuszczającą wartość null (tj. int?) Zawierającą wartość 1, otrzymujesz wynik z <null>powrotem. Jeśli jest to ciąg (jak pokazano w komentarzu) z wartością "1", to "1"zamiast tego wracasz <null>.
NB Również interesujące: jeśli używasz var x = 1;w pierwszej linii, pojawia się błąd wykonania. Czemu? Ponieważ przypisanie zmieni zmienną xw typ danych int, który nie dopuszcza wartości null. Kompilator nie zakłada int?tutaj, a zatem kończy się niepowodzeniem w drugiej linii, w której nulljest dodawany.
null.ToString()nadano tobie imięwtf. Dlaczego to cię dziwi? Nie możesz wywołać metody instancji, jeśli nie masz z czego jej wywołać.