2009-12-23 11 views
8

In C#, wird das folgende Verfahren nicht kompiliert:Warum verhält sich der Compiler anders mit diesem Code?

public bool IsItTrue() 
{ 
} 

Compiler-Fehler: 'IsItTrue()': nicht alle Codepfade einen Wert zurückgeben, was durchaus Sinn macht. Aber folgendes Kompilieren ohne irgendein Problem.

public bool IsItTrue() 
{ 
    while (true) 
    { 
    } 
} 

Das scheint falsch, da keine Rückmeldung überhaupt. Wieso ist es so? Jede Hilfe hier ...,

Antwort

13

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

Wenn eine der Methoden jemals zurückkehrt, müssen sie eine bool zurückgeben.

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

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

Noch ein paar Beispiele, dass der Compiler erkennen und erlauben:

public bool IsItTrue() 
{ 
    throw new Exception("Always thrown!"); 
} 

public bool HowAboutThisOne() 
{ 
    if ((46 - 3) < (27 * 9)) 
    { 
     throw new Exception("Always thrown!"); 
    } 
} 
+0

Kleine Erklärung bitte .., – Dhana

+0

Interessant, dass der Compiler das zulassen würde.Ich kann sehen, warum es erlaubt werden darf, aber ich frage mich, was dem Zweck des wirklichen Lebens dient. –

+0

Ich weiß, dass wir etwas Ähnliches für einen Thread (True) möchten, aber selbst ein Thread sollte irgendwann enden? Wenn also der Compiler eine solche Situation erkennt, warum wirft er keinen Fehlerpunkt in eine Endlosschleife? – uriDium

3

Die erste ist schön durch die Compiler Fehlermeldung erklärt.

Die zweite kehrt nie, so gibt es nie jeder Wert zurückgegeben.

Es ist nicht das Gleiche. In Ihrem ersten Beispiel könnte die Methode zurückkehren, ohne dem Aufrufer irgendeinen Wert zurückzugeben -> Compiler-Fehler.

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 in den Zustand "Okay, ich habe das Ende der Methode erreicht und weiß nicht, was ich zurückgeben soll" eintreten.

1

Die Halting Problem besagt, dass Sie im Allgemeinen nicht bestimmen können, ob ein Programm für immer beendet oder ausgeführt wird. Angesichts der Tatsache, dass es Beispiele in diesem Thread gibt, die gegen dieses Prinzip verstoßen, vermute ich, dass der C# -Compiler eine Analyse der Schleifenbedingungen durchführt, die auf eine Kompilierzeitkonstante reduziert werden kann. Wenn die Konstante true ergibt, wissen wir, dass die Schleife niemals enden wird.

Betrachten Sie zum Beispiel die folgenden zwei Funktionen.

public bool NoError() 
{ 
    while (true) { } 
} 

public bool Error() 
{ 
    while (NoError()) { } 
} 

Wie gezeigt, generiert 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.

Verwandte Themen