Ok, beachte den folgenden Code:
%Vor%Überraschenderweise verursacht dieser Code keine " Verwendung der nicht zugewiesenen lokalen Variablen" Hallo "" Kompilierzeitfehler. Es gibt einfach eine Warnung " Nicht erreichbarer Code erkannt ".
Auch wenn der Code nicht erreichbar ist, ist es immer noch ein Fehler bei der Kompilierung, ich denke, es ist richtig, einen Kompilierzeitfehler zu werfen. Wenn ich folgendes tun sollte:
%Vor%Natürlich bekomme ich eine " 'Zeichenfolge" enthält keine Definition für' LMFAO 'und keine Erweiterungsmethode' LMFAO ', die ein erstes Argument vom Typ' string 'akzeptiert, könnte gefunden werden (fehlt eine Verwendung Direktive oder eine Assemblyreferenz?) "Kompilierzeitfehler.
Warum ist das bei der Verwendung einer nicht zugewiesenen Variablen nicht dasselbe?
BEARBEITEN Die Variable const
wurde so geändert, dass sie weniger störend wirkt. Ich denke, vielen fehlt der Punkt der Frage, der davon abhängt, in welchem Fall Kompilierzeitfehler Vorrang vor unerreichbarem Code haben.
James Michael Hares Antwort gibt die de jure Erklärung: die lokale Variable ist definitiv zugewiesen, weil der Code nicht erreichbar ist und alle lokalen Variablen definitiv in nicht erreichbaren Code zugewiesen sind. Anders ausgedrückt: Das Programm ist nur ein Fehler, wenn es möglich ist, den Zustand der nicht initialisierten lokalen Variablen zu beobachten . In Ihrem Programm gibt es keine Möglichkeit, das lokale zu beobachten, und deshalb ist es kein Fehler.
Nun bemerke ich, dass der Compiler nicht unendlich clever sein muss. Zum Beispiel:
%Vor%Sie wissen, und ich weiß, dass die letzte Zeile der Methode nicht erreichbar ist, aber der Compiler weiß das nicht, weil der Erreichbarkeitsanalysator nicht weiß, dass Null die additive Identität von ganzen Zahlen ist. Der Compiler denkt, dass die letzte Zeile erreichbar sein könnte, und gibt so einen Fehler.
Weitere Informationen zu Aspekten der Gestaltung von Erreichbarkeits- und Definit-Assignment-Analysatoren in Programmiersprachen finden Sie in meinen Artikeln zum Thema:
Ich stelle jedoch fest, dass niemand die tiefere Frage beantwortet hat: warum sollte der Fehler in unerreichbarem Code unterdrückt werden? Wie Sie bemerken, geben wir andere semantische Analysefehler in unerreichbarem Code.
Um die Vor- und Nachteile dieser Entscheidung zu berücksichtigen, müssen Sie darüber nachdenken, warum jemand überhaupt nicht erreichbaren Code hat. Entweder ist es absichtlich unerreichbar oder unabsichtlich unerreichbar.
Wenn es unbeabsichtigt unerreichbar ist, dann enthält das Programm einen Fehler. Die Warnung weist bereits auf das Hauptproblem hin: Der Code ist nicht erreichbar. Es gibt etwas , das mit dem Kontrollfluss der Methode nicht stimmt, wenn Code nicht erreichbar ist. Die Chancen stehen gut, dass der Entwickler den Kontrollfluss der Methode ernsthaft ändern muss. Jede lokale Variablenanalyse, die wir für den nicht erreichbaren Code durchführen, ist wahrscheinlich ein irreführendes Geräusch. Lassen Sie den Entwickler den Code so korrigieren, dass alles erreichbar ist, und dann machen wir eine Analyse des nun erreichbaren Codes für Fehler im Zusammenhang mit dem Kontrollfluss.
Wenn der unerreichbare Code unerreichbar ist, weil der Entwickler beabsichtigt , dass er unerreichbar ist, dann sind die Chancen gut, dass sie so etwas tun:
%Vor% Sollte Frob(y)
ein Fehler in diesem Programm sein?
Wenn Sie in der C # -Sprachspezifikation
Für eine anfänglich nicht zugewiesene Variable, die definitiv berücksichtigt werden soll Zugewiesen an einem bestimmten Ort muss eine Zuordnung zu der Variablen erfolgen treten in jedem möglichen Ausführungspfad auf, der zu diesem Ort führt.
Und weiter in 5.3.3.1:
v wird definitiv zu Beginn einer nicht erreichbaren Anweisung zugewiesen.
Da nicht erreichbarer Code kein möglicher Ausführungspfad ist, muss er nicht zugewiesen werden, um einen Fehler zu vermeiden.
Was Ihre Frage betrifft, warum eine unbekannte Funktion ein Compilerfehler in nicht erreichbarem Code ist und eine nicht zugewiesene Variable nicht. Sie müssen den obigen Standard beachten. Der nicht erreichbare Code bedeutet nicht, dass er nicht syntaktisch gültig sein kann. Der Code muss noch kompilierbar sein, der einzige Unterschied, den der nicht erreichbare Code macht, ist, dass er alle anfänglich nicht zugewiesenen Variablen berücksichtigt, die an diesem Punkt zugewiesen sind. Aber das bedeutet nicht, dass Sie etwas syntaktisch ungültig wie eine undefinierte Variable oder Methode injizieren können.
Die Fehlermeldung für nicht zugewiesene Variablen gibt uns auch einen Hinweis darauf, dass es uns sagt, dass eine anfänglich nicht zugewiesene Variable vor der Verwendung zugewiesen werden muss, aber weil der Code nicht erreichbar ist, wird er technisch nicht verwendet ...
Wenn der Compiler erkennt, dass Code nicht erreichbar ist, erzeugt er keinen Code dafür - und daher gibt es kein Problem.
Wenn Sie diese return
-Zeile herausnehmen, wird die letzte Zeile wieder erreichbar, der Compiler erzeugt Code dafür und wird Ihnen sagen, dass ein Problem damit besteht.
Tags und Links c#