2013-05-22 6 views

Antwort

17

Die Art der bar ist noch int?, und es gibt keine implizite Konvertierung von int? zu int.

Die Bedingung ändert nicht die Gültigkeit des späteren Codes. Das gleiche gilt für andere Besetzungen:

object x = ...; 
if (x is string) 
{ 
    string y = x; // This is still invalid 
    string z = (string) x; // This is fine 
} 

Der Compiler selten das Ergebnis von einem Stück Code verwendet die Gültigkeit eines anderen zu beeinflussen. Als weiteres Beispiel:

bool condition = ...; 
string x; 
if (condition) 
{ 
    x = "yes"; 
} 
if (!condition) 
{ 
    x = "no"; 
} 
Console.WriteLine(x); // Invalid 

Die letzte Zeile ist ungültig, weil x ist noch nicht eindeutig zugewiesen. Wir wissen, dass, was auch immer der Wert von x, geben wir einen von diesen if Anweisung Körper ... aber der Compiler versucht nicht, dies herauszufinden.

Obwohl dies dumm scheint, macht es die Sprachregeln wesentlich einfacher.

+0

Ich denke, das beantwortet den Buchstaben der Frage, aber nicht den Geist. Der Grundgedanke der Frage lautet: "Warum wird der Umwandlungsoperator' Nullable' 'explizit' anstatt 'implizit' erklärt? " '' 'Edit:' '' Tatsächlich beantwortet es warum. Mein Fehler. – Medinoc

21

Der Vergleich sagt nur - es ist nicht null, Compiler verwendet noch Typ, um zu sehen, ob die Zuordnung vorgenommen werden kann.

Folgende würde Kompilieren auch ohne Nullprüfung.

foo = (int)bar; 
3

Der Compiler überprüft nur, ob Ihr Programm syntaktisch korrekt ist. Ihr Null-Check ist nicht wichtig.

Der Compiler sieht, dass Sie Informationen verlieren können, die einen int zuweisen? zu int und deshalb klagt es.

1

Stellen Sie sich dies vor: Was wäre, wenn Sie eine Elementvariable wie Nullable<int> eingegeben hätten, auf die von mehreren Threads zugegriffen wurde. Sehen wir uns Ihren Code unter diesen Umständen an.

if(foo != null) 
{ 
    // expensive operation that takes time. 
    // what if another thread as nulled foo in the meantime? 
    int bar = foo; 
} 
+0

Sind "(int) foo" und "foo.Value" auch nicht threadsicher? – Stijn

Verwandte Themen