Lokale Variable
-
@µ: Gleicher Gedanke mit dem Link; Wa?
µ schrieb:
Mach das einfach so.
Dann ist der Compiler schlau genug zu erkennen, dass sValidation einen Wert hat.string sValidation; if (valid)// == true) { sValidation = "..."; } else//if (valid == false) { sValidation = "..."; }
-
Hellsgore schrieb:
@µ: Gleicher Gedanke mit dem Link; Wa?
Der Ausdruck verursacht eben heftige Schmerzen
Edit:
int i = 0; loop: { Console.WriteLine(i++); } if(i<10) goto loop;
-
T_G schrieb:
Fehlermeldung:
Verwendung der nicht zugewiesenen lokalen Variable "sValidation"Der Compiler sieht, dass es theoretisch einen Programmpfad von der Deklaration der Variablen zu ihrer Verwendung gibt, auf dem sie nicht initialisiert wird.
Dass immer eine der beiden if-Bedingungen wahr sein muss und es daher eigentlich keinen solche Pfad geben kann, das analysiert der Compiler an der Stelle nicht so genau.
Sonst das was mü gesagt hat.
-
Danke µ, so klappt es.
Liegt der "Fehler" also am Compiler?*schäm* if-Schleife *schäm*
Aber man lernt nie aus!Danke!
-
T_G schrieb:
Liegt der "Fehler" also am Compiler?
Nein, an der Sprachdefinition. Die haben das da so reingeschrieben, damit der Compiler solche Analysen nicht fahren muss. Man muss aber auch dazusagen, dass es da theoretische Grenzen gibt (
Halteproblem), d.h. wenn das Programm kompliziert genug ist kann kein noch so guter Compiler entscheiden, ob die Variable auf irgendeinem Pfad uninitialisiert bleibt. Deshalb kann ich mir vorstellen, dass man von vornherein festgelegt hat, dass ein Compiler sich auch bei einfachen Fällen "dumm stellen" darf.
-
Ist auch kein ganz triviales Problem.
In dem speziellen Fall kann man vermutlich wirklich sicher sein.Sobald aber die Möglichkeit existiert, dass irgendwer irgendwo irgendwie die Bedingung ändert (und sei's auch über "nicht erlaubte" Dinge wie Zugriffe aus nem anderen Thread ohne Synchronisation, oder über Reflection oder sonstwas bekifftes), muss der Compiler korrekterweise verweigern.
-
Hallo - Quasi wieder das selbe Problem:
int iCount; for (int i = 0; i < r; i++) { ... iCount = i; ... } SaveValue(sParent, iCount);
iCount wird beim Methodenaufruf unten: Der Name iCount ist im aktuellen Kontext nicht vorhanden.
Gibt es dafür auch eine Lösung?
Merci
Thomas
-
Es ist immer die gleiche Lösung: Du musst sicherstellen, dass eine lokale Variable vor ihrer ersten Verwendung einen Wert erhält.
Wäre r==0, würde die Schleife übersprungen und iCount uninitialisiert verwendet werden.Schreib eben
int iCount=0;
insofern das Sinn ergibt.
-
Jetzt hab ich es (hoffentlich) verstanden ... muss also immer erst initialisiert werden. Ist wahrscheinlich grundsätzlich auch besserer Stil?!
Thomas
-
T_G schrieb:
Ist wahrscheinlich grundsätzlich auch besserer Stil?!
Ja. Weil man dadurch
a) "gezwungen" wird darüber nachzudenken welchen Wert die Variable haben sollte wenn der folgende Code sie nicht überschreibt und
b) man beim Lesen auch gleich sieht welchen Wert die Variable haben wird wenn sie nicht später überschrieben wird.