为什么我不能在break;
循环中使用while
语句,而在匿名方法中呢?
当我收到此错误时,我正在处理这段代码(下面):“Control cannot leave the body of an anonymous method or lambda expression
”。
谢天谢地,我可以使用return;
来解决问题,但我仍然想知道为什么我无法使用break;
。对我来说,两个语句之间的主要区别在于return;
退出方法,而break;
退出了最嵌套的循环。
我的代码,
while (someCondition)
{
System.Threading.Thread.Sleep(500);
Application.Current.Dispatcher.Invoke(new Action(() =>
{
if (someOtherCondition)
{
// Do stuff...
}
else
{
if (anotherCondition)
{
break;
}
// Do something else...
}
}));
}
答案 0 :(得分:6)
重写代码有助于解释原因:
while (someCondition)
{
System.Threading.Thread.Sleep(500);
Application.Current.Dispatcher.Invoke(MyMethod);
}
private void MyMethod()
{
if (someOtherCondition)
{
// Do stuff...
}
else
{
if (anotherCondition)
{
break;
}
// Do something else...
}
}
你正在打破一个没有循环的函数。循环存在于另一种方法中。因此,正如您所发现的那样,需要调用返回。仅仅因为你使用的是匿名方法,它仍然是一个与包含while循环的方法分开的方法。
答案 1 :(得分:5)
出于同样的原因你不能这样做:
while(1)
{
method1();
}
void method1()
{
break;
}
即使您的匿名方法使用与while循环相同的函数编写,它仍然可以从没有while循环的地方调用。
答案 2 :(得分:2)
中断;不能用于退出方法,而是需要返回。而在方法内部,您的范围仅限于该方法,因为它可以从任何地方调用。虽然在方法内部没有关于调用范围和代码的信息,因此不知道是否有一个循环突破。因此方法范围不同于if语句的范围。
答案 3 :(得分:0)
Return会将你带出一个方法或函数,但是break会让你退出循环或迭代。
这是主要的差异。
// This is Oki
public void Do()
{
for (int i = 0; i < 10; i++)
{
break;
}
}
// This is a compiler error
public void Do()
{
break;
}
答案 4 :(得分:-2)
你可以改变while的条件:
while (someCondition)
{
System.Threading.Thread.Sleep(500);
Application.Current.Dispatcher.Invoke(new Action(() =>
{
if (someOtherCondition)
{
// Do stuff...
}
else
{
if (anotherCondition)
{
//break;
someCondition = false;
return;
}
// Do something else...
}
}));
if (!someCondition)
break;
}