2010-06-22 179 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聲明將退出。