Warum verhält sich der Compiler anders mit diesem Code?

8

In C # kompiliert die folgende Methode nicht:

%Vor%

Die Compiler-Fehler: 'IsItTrue ()': Nicht alle Code-Pfade geben einen Wert zurück, was sehr sinnvoll ist. Aber folgendes Kompilieren ohne irgendein Problem.

%Vor%

Was falsch aussieht, da es überhaupt keine Rückmeldung gibt. Wieso ist es so? Jede Hilfe hier ...,

    
Dhana 23.12.2009, 12:50
quelle

3 Antworten

13

Der Compiler weiß, dass die zweite Methode niemals zurückkehren wird.

Wenn eine der Methoden jemals zurückgegeben wird, muss eine bool zurückgegeben werden.

Die erste Methode enthält keine Endlosschleifen, keine bedingten Ausnahmen usw., daher muss ein bool zurückgegeben werden. Der Code gibt kein bool zurück, so dass der Compiler es nicht kompiliert.

Die zweite Methode kehrt wegen der unendlichen while (true) -Schleife nie zurück. Wenn nie zurückgegeben wird, ist es egal, was (wenn überhaupt) nie ist, damit der Compiler es kompilieren kann.

Ein paar weitere Beispiele, die der Compiler erkennt und erlaubt:

%Vor%     
LukeH 23.12.2009, 12:54
quelle
3

Das erste wird schön durch die Fehlermeldung des Compilers erklärt.

Das zweite gibt niemals zurück, daher wird nie ein Wert zurückgegeben.

Es ist nicht dasselbe. In Ihrem ersten Beispiel könnte die Methode zurückkehren, ohne dem Aufrufer irgendeinen Wert zurückzugeben - & gt; Compilerfehler.

Die zweite wird nie zurückkehren (der Compiler ist schlau genug dafür, er stellt fest, dass Sie eine Endlosschleife erstellt haben). Es wird niemals den Status "Okay, ich habe das Ende der Methode erreicht und weiß nicht, was ich zurückgeben soll" eingegeben.

    
Benjamin Podszun 23.12.2009 13:00
quelle
1

Das Problem beim Beenden besagt, dass Sie im Allgemeinen nicht feststellen können, ob ein Programm für immer beendet oder ausgeführt wird. Angesichts der Tatsache, dass es Beispiele in diesem Thread gibt, die dieses Prinzip zu verletzen scheinen, vermute ich, dass der C # -Compiler eine Analyse der Schleifenbedingungen durchführt, die auf eine Zeitkonstante für die Kompilierung reduziert werden kann. Wenn die Konstante zu true ausgewertet wird, wissen wir, dass die Schleife niemals enden wird.

Betrachten Sie zum Beispiel die folgenden zwei Funktionen.

%Vor%

Wie gezeigt, erzeugt die erste Funktion keinen Kompilierzeitfehler. Der zweite wird jedoch sein, da der Compiler das Ergebnis des Funktionsaufrufs NoError() nicht auswerten kann. Dies ist auch der Fall, wenn NoError() so geändert wird, dass immer true zurückgegeben wird.

    
Steve Guidi 23.12.2009 15:16
quelle

Tags und Links