2010-06-22 138 views
2

我得到一个编译时错误这个switch语句

“UserQuery.ReturnInt(UserQuery.Foo)”编译时错误:不是所有的代码路径返回一个值

除非我没有看到在代码中的东西,switch语句应该返回0作为默认值,所以所有代码路径do都会返回一个值。

enum Foo 
{ 
    Bar, 
    Zoo, 
    Boo 
} 

void Main() 
{ 
    Foo test = Foo.Bar; 

    Console.WriteLine (ReturnInt(test)); 
} 

int ReturnInt(Foo test) { 

    int someOtherValue = 4; // <---Value may change depending on X 

    switch (test) 
    { 
     case Foo.Bar: 
      if (someOtherValue > 20) 
       return 1; 
      break; 

     case Foo.Zoo: 
      if (someOtherValue == 5) 
       return 4; 
      break; 

     case Foo.Boo: 
      if (someOtherValue == 2) 
       return 7; 
      break; 

     default: 
      return 0; 
    } 
} 

回答

6

根据“someOtherValue”的值,任何其他开关块都会触发“break”语句。切换后没有返回语句,因此任何发生“break”的情况都不会返回值。

+0

好景点!不能相信我错过了这一点。 – 2010-06-22 01:21:41

1

您需要在end方法中使用return语句。我的猜测是你希望它返回0.
你已经在switch语句中设置了防止它们在每个语句中都返回return语句的条件。

case Foo.Bar: 
      if (someOtherValue > 20) 
       return 1; 
      break; 

在此语句是test等于Foo.BarsomeOtherValue <= 20,那么这个return语句永远不会到达。所有当前的开关语句都是如此(默认的除外)。即使业务逻辑设置为永远不会发生这种情况,编译器也不会知道这一点,所以它会告诉你并不是所有的路径都返回一个值。

5

我会改变它,所以只有一个返回点,我喜欢为清楚起见,无论如何。 :-)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace HelloWorld 
{ 
    class Program 
    { 
     static int ReturnInt(Foo test) 
     { 
      int retVal = 0; // defaults to 0 

      int someOtherValue = 4; // <---Value may change depending on X 


      switch (test) 
      { 
       case Foo.Bar: 

         if (someOtherValue > 20) 
          retVal = 1; 
         break; 

       case Foo.Zoo: 

         if (someOtherValue == 5) 
          retVal = 4; 
         break; 

       case Foo.Boo: 

         if (someOtherValue == 2) 
          retVal = 7; 
         break; 

       default: 
         retVal = 0; 
         break; 

      } 
      return retVal; 
     } 

     enum Foo 
     { 
      Bar, 
      Zoo, 
      Boo 
     } 

     static void Main(string[] args) 
     { 
      Foo test = Foo.Bar; 

      Console.WriteLine(ReturnInt(test)); 
     } 
    } 
} 
0

两件事:

1)代码明智的,如果任何break语句执行,那么switch声明将退出,并没有值将被退回。

2)从概念上讲,你说switch语句应该返回一个默认值0,这是真的,但是你打开的变量是test。对于未列出的任何值testswitch语句将返回0。 Foo.ParkFoo.Library。如果switch语句与任何列出的值匹配,例如Foo.Bar,那么只有该块内的代码将被执行。 switch声明将退出。