以下是来自this post的Eric Lippert的评论:
现在你知道了答案,你可以 解决这个难题:给我写一个程序 其中有一个可达的goto 这是一个无法访问的标签。 - Eric Lippert 7月17日7:17
我无法创建一个代码,该代码具有指向无法访问标签的可访问goto。这甚至可能吗?如果是,C#代码会是什么样的?
注意:我们不要讨论'goto'是如何不好等等。这是一个理论练习。
答案 0 :(得分:13)
我原来的回答:
try
{
goto ILikeCheese;
}
finally
{
throw new InvalidOperationException("You only have cottage cheese.");
}
ILikeCheese:
Console.WriteLine("MMM. Cheese is yummy.");
这里没有编译器警告。
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 :(得分:0)
顺便说一句,如果您使用goto csharp编译器,例如这种情况没有finally块,则将代码更改为没有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.");
}
}
转向:
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.");
}
答案 2 :(得分:0)
goto cant_reach_me;
try{
cant_reach_me:
}
catch{}
这是编译或运行时错误,我不记得了。标签必须在try / catch块之外