Ich bin heute darauf gestoßen und habe keine Ahnung, warum der C # -Compiler keinen Fehler auslöst.
Int32 x = 1;
if (x == null)
{
Console.WriteLine("What the?");
}
Ich bin verwirrt darüber, wie x jemals null sein könnte. Zumal diese Zuweisung definitiv einen Compilerfehler auslöst:
Int32 x = null;
Ist es möglich, dass x null wird, hat Microsoft nur beschlossen, diese Prüfung nicht in den Compiler zu stellen, oder wurde sie vollständig übersehen?
Update: Nachdem der Compiler mit dem Code zum Schreiben dieses Artikels herumgespielt hatte, kam plötzlich eine Warnung heraus, dass der Ausdruck niemals wahr sein würde. Jetzt bin ich wirklich verloren. Ich habe das Objekt in eine Klasse eingefügt und jetzt ist die Warnung verschwunden, aber es bleibt die Frage, ob ein Werttyp am Ende null sein kann.
public class Test
{
public DateTime ADate = DateTime.Now;
public Test ()
{
Test test = new Test();
if (test.ADate == null)
{
Console.WriteLine("What the?");
}
}
}
int
generiert der Compiler nette Warnungen. Für die einfachen Typen wird der ==
Operator durch die C # -Sprachenspezifikation definiert. Bei anderen (nicht einfachen) Strukturen vergisst der Compiler , eine Warnung auszugeben . Weitere Informationen finden Sie unter Falsche Compiler-Warnung beim Vergleich von struct mit null . Bei Strukturen, die keine einfachen Typen sind, ==
muss der Operator von einer opeartor ==
Methode überladen werden , die Mitglied der Struktur ist (andernfalls ist no ==
zulässig).
if (1 == 2)
. Es ist nicht die Aufgabe des Compilers, eine Codepfadanalyse durchzuführen. Dafür sind statische Analysewerkzeuge und Komponententests gedacht.