2009-07-22 5 views
4

Hier Eric Lippert Kommentar von this post:C# Puzzle: Erreichbar gehe zu einem unerreichbaren Label zeigt

Nun, da Sie die Antwort wissen, können Sie das Rätsel lösen: schreiben Sie mir ein Programm , in dem es ein erreichbar goto was zu einem unerreichbaren Label führt. - Eric Lippert 17. Juli bei 7:17

Ich bin nicht in der Lage, einen Code zu erstellen, die erreichbar gingen zu einem unerreichbaren Label zeigen haben. Ist das überhaupt möglich? Wenn ja, wie würde der C# -Code aussehen?

Hinweis: Lassen Sie uns nicht darüber diskutieren, wie "Goto" schlecht ist usw. Dies ist eine theoretische Übung.

Antwort

13

Meine ursprüngliche Antwort:

try 
    { 
     goto ILikeCheese; 
    } 
    finally 
    { 
     throw new InvalidOperationException("You only have cottage cheese."); 
    } 
ILikeCheese: 
    Console.WriteLine("MMM. Cheese is yummy."); 

ist hier ohne die Compiler-Warnung.

bool jumping = false; 
    try 
    { 
     if (DateTime.Now < DateTime.MaxValue) 
     { 
      jumping = (Environment.NewLine != "\t"); 
      goto ILikeCheese; 
     } 

     return; 
    } 
    finally 
    { 
     if (jumping) 
      throw new InvalidOperationException("You only have cottage cheese."); 
    } 
ILikeCheese: 
    Console.WriteLine("MMM. Cheese is yummy."); 
+1

Falsch. Die Dokumentation für goto sagt, dass wenn es in einem try-finally-Block ist, der finally noch ausgeführt wird. –

+6

@Guard: Ist das nicht der Punkt? –

+0

Für den obigen Code gibt der Compiler eine Warnung aus, dass "nicht erreichbarer Code" erkannt wurde. Ich habe über ein Beispiel nachgedacht, bei dem der Compiler nicht erkennen kann, dass das Label nicht erreichbar ist. Zumindest dachte ich darüber nach, als Eric diesen Kommentar gepostet hat. – SolutionYogi

0

Durch die Art und Weise, wenn Sie den csharp Compiler zum Beispiel für diesen Fall verwenden goto ohne schließlich Block ändert den Code auf eine Version ohne goto.

using System; 
public class InternalTesting 
{ 
public static void Main(string[] args) 
{ 
    bool jumping = false; 
    try 
    { 
     if (DateTime.Now < DateTime.MaxValue) 
     { 
      jumping = (Environment.NewLine != "\t"); 
      goto ILikeCheese; 
     } 
    else{ 
      return; 
    } 
    } 
    finally 
    { 
     if (jumping) 
{ 
      //throw new InvalidOperationException("You only have cottage cheese."); 
    Console.WriteLine("Test Me Deeply"); 
} 
    } 
ILikeCheese: 
    Console.WriteLine("MMM. Cheese is yummy."); 
} 
} 

Turns To:

public static void Main(string[] args) 
{ 
    bool flag = false; 
    try 
    { 
     if (DateTime.Now < DateTime.MaxValue) 
     { 
      flag = Environment.NewLine != "\t"; 
     } 
     else 
     { 
      return; 
     } 
    } 
    finally 
    { 
     if (flag) 
     { 
      Console.WriteLine("Test Me Deeply"); 
     } 
    } 
    Console.WriteLine("MMM. Cheese is yummy."); 
} 
0
goto cant_reach_me; 

try{ 
cant_reach_me: 
} 
catch{} 

Dies wird entweder eine Kompilierung oder Laufzeitfehler, kann ich mich nicht erinnern. Das Etikett muss sich außerhalb des Try/Catch-Blocks befinden.