Das Verschieben der Bedingung "if" in eine lokale Variable macht den C # Compiler unglücklich

7

Könnten Sie mir bitte den Grund für die folgende Situation erklären?

Heute habe ich den Code geschrieben (nur Variablennamen werden geändert):

%Vor%

Alles war in Ordnung, bis ich beschloss, die Bedingung if in eine Variable zu verschieben:

%Vor%

Der Compiler unterstützt jetzt die Variablen firstInteger und secondInteger mit dem Fehler "Lokale Variable wird möglicherweise vor dem Zugriff nicht initialisiert".

Aber warum? Das einzige, was ich gemacht habe, ist, den Code ein wenig zu überarbeiten. Und wie ich es sehe, ist die Logik dieselbe.

    
Maxim Timofeev 18.03.2011, 21:50
quelle

6 Antworten

9

Der Compiler (bzw. die Spezifikation) erkennt nicht die Beziehung zwischen dem Wert von firstIntegerAndSecondIntegerAreSpecified und den Aufrufen von int.TryParse . In der ersten Form könnte es funktionieren, dass die Ausführung nur dann in den Körper eintritt, wenn beide Aufrufe von int.TryParse ausgeführt wurden und daher beide Werte definitiv zugewiesen haben (aufgrund der Parameter out ). Daher gab es im if -Block kein Problem.

Die Regeln für die definitive Zuweisung decken nicht die Idee ab, dass firstIntegerAndSecondIntegerAreSpecified nur dann wahr ist, wenn beide Aufrufe gemacht wurden. Daher sind die Variablen im Rumpf des Blocks if noch nicht definitiv zugewiesen der Fehler.

    
Jon Skeet 18.03.2011, 21:54
quelle
6

Der Compiler ist nicht so clever genug, um herauszufinden, dass ein wahrer Wert in der booleschen Variable sicherstellt, dass die Werte in der ganzen Zahl gesetzt sind. Der Compiler verfolgt nur die Ausführungspfade, nicht die möglichen Werte.

Im ersten Fall weiß der Compiler, dass es unmöglich ist, die if-Anweisung einzugeben, ohne dass die TryParse -Aufrufe die Variablen setzen. Im zweiten Fall wird die if-Anweisung von den TryParse -Aufrufen getrennt, sodass der Compiler den Variablenwert verfolgen muss, um die Beziehung herauszufinden.

    
Guffa 18.03.2011 21:56
quelle
3

Im ersten Fall kann der Compiler die Bedingung if und wissen betrachten, die der Körper nur ausführen kann, wenn beide Variablen Werte haben ( TryParse immer setzt den Parameter out , auch wenn es fehlschlägt.

Wenn Sie diese Bedingung in eine Variable umformulieren, müsste der Compiler diese lokale Variable verfolgen, um sicherzustellen, dass von dieser nicht geschrieben werden kann, wenn sie zugewiesen ist, wenn sie als Bedingung verwendet wird. Da der Compiler nicht so clever ist, kann er nicht sicher sein, dass Ihre Variablen initialisiert sind ("definitiv zugewiesen"), so dass Sie einen Fehler erhalten.

    
Gabe 18.03.2011 21:56
quelle
1

Die if -Anweisung kann nur eingegeben werden, wenn beide Ausdrücke ausgeführt werden, aber die bool kann vorzeitig wegen eines Kurzschlusses zugewiesen werden - wenn die erste Zeichenfolge nicht analysiert wird, überspringt der Compiler die zweite Zeichenfolge , denn unabhängig vom Ergebnis muss der bool-Wert false sein.

    
T.K. 18.03.2011 21:58
quelle
0

Der Compiler gibt diesen Fehler manchmal. Natürlich werden Sie sehen, dass die Variablen vor der Verwendung immer initialisiert werden, wenn Sie der Logik Ihres Codes folgen. Aber der Compiler führt die Logik nicht aus, er handelt nur nach einigen Grundregeln. Und deshalb gibt es oft diesen Fehler, selbst wenn tatsächlich kein Fehler in der Logik vorliegt.

Die Lösung ist einfach: Initialisieren Sie alle Variablen erst, wenn Sie sie deklarieren.

    
Ilya Kogan 18.03.2011 21:59
quelle
0

Hinzufügen zu Jons Antwort -

Es könnte einfacher sein, beide Ganzzahlen getrennt zu behandeln. Und es ist auch nicht notwendig, nach NullOrWhiteSpace zu suchen.

%Vor%

Sie könnten dieses Stück sogar in einer separaten Methode extrahieren

    
Unmesh Kondolikar 18.03.2011 22:02
quelle

Tags und Links