1

为什么我不能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...
        }
    }));
}
4

5 回答 5

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...
    }
}

您正在打破一个没有循环的函数。循环存在于另一种方法中。因此,正如您发现的那样,需要调用 return 。仅仅因为您使用的是匿名方法,它仍然是包含 while 循环的方法的单独方法。

于 2013-10-16T12:09:05.230 回答
5

出于同样的原因,您不能这样做:

while(1)
{
    method1();
}

void method1()
{
    break;
}

即使您的匿名方法是在与您的 while 循环相同的函数中编写的,它仍然可以从没有 while 循环的地方调用。

于 2013-10-16T12:09:41.697 回答
2

休息; 不能用于退出方法,而是需要返回。而在方法内部,您的范围仅限于该方法,因为它可以从任何地方调用。在方法内部,没有关于调用范围的信息,因此代码不知道是否存在要跳出的循环。因此,方法范围与 if 语句的范围不同。

于 2013-10-16T12:16:44.093 回答
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;        
}       
于 2013-10-16T12:17:52.853 回答
-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;
}
于 2015-01-07T17:00:51.417 回答