为什么我不能在匿名方法中使用while循环中的break?

时间:2013-10-16 12:05:10

标签: c# loops while-loop break anonymous-methods

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

5 个答案:

答案 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;
}