Ich habe zwei Methoden, von denen beide kompiliert richtig:Nicht zugewiesene lokale Variable und Kurzschluss Auswertung
public int A()
{
int i;
if(!int.TryParse("0", out i))
{
return -1;
}
// do sth
return i;
}
public int B()
{
int i;
if(true)
{
return -1;
}
return i;
}
Im zweiten Fall (Methode B
) Compiler intelligent genug, um die Variable zu detektieren i
wird nie so verwendet, es beschwert sich nicht, es nicht zuzuweisen.
Allerdings habe ich ein anderes Beispiel (eine Kombination aus beiden), die B
äquivalent Methode zu sein scheint:
public int C()
{
int i;
if (true || !int.TryParse("0", out i))
{
return -1;
}
return i;
}
Wenn unter Windows unter Visual Studio 2012 (.NET Framework kompilieren 4.6.01055) es wirft einen Fehler auf: Use of unassigned local variable 'i'
. Die Lösung ist:
i
mit einem beliebigen Wert initialisiert werden, oder- Verwendung
|
Operator anstelle von||
.
Warum ist das so? Es sieht so aus, als hätte ein Compiler alle notwendigen Daten, um nicht erreichbaren Code zu erkennen.
Exkurs: Beispiel C
kompiliert auf Linux unter Mono 4.6.2 mit Warnungen über nicht erreichbaren Code wie erwartet.
Kennen Sie das Halteproblem (https://en.wikipedia.org/wiki/Halting_problem)? Das ist hauptsächlich der Grund, warum Compiler nicht immer erwartet werden können, um zu wissen, ob Ihr Code nicht erreichbar ist ... – Idos
Es gab einen alten Bug ganz ähnlich, aber es ging um [dynamic] (http://stackoverflow.com/a/36062697/15498) –
Im ersten Beispiel in Methode B - wenn Sie nach der schließenden Klammer der _ "if (true)" _ Anweisung ungültigen Code geschrieben haben, würde dies einen Compilerfehler erzeugen, obwohl er nicht erreichbar ist - also die Verwendung eines nicht zugewiesenen Locals meldet Variable scheint ein konsistenter Ansatz. – PaulF