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 null
traktowania 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 x
jest 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ą x
w 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 null
jest 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ć.