2017-07-26 74 views
1

我正在創建下面的方法,它返回一個標準化的十進制值。 AngleUnits是一個包含Degrees,Gradians,Radians和Turns的枚舉。然而,在實現此代碼後,我得到「Angle.Normalize(...)並非所有代碼路徑都返回值」。不知道我在這裏丟失了什麼,因爲我正在返回小數值。提前致謝。C#方法不是所有的代碼路徑都返回一個值

private static decimal Normalize(decimal value, AngleUnits units) 
    { 
     decimal normalizedValue; 

     switch (units) 
     { 
      case AngleUnits.Degrees: 
       if (value >= 0 && value <= 360) 
       { 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       else if (value < 0) 
       { 
        value = value + 360; 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       else if (value > 360) 
       { 
        value = value - 360; 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       break; 

      case AngleUnits.Gradians: 
       if (value >= 0 && value <= 400) 
       { 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       else if (value < 0) 
       { 
        value = value + 400; 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       else if (value > 400) 
       { 
        value = value - 400; 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       break; 

      case AngleUnits.Radians: 
       if (value >= 0 && value <= twoPi) 
       { 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       else if (value < 0) 
       { 
        value = value + twoPi; 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       else if (value > twoPi) 
       { 
        value = value - twoPi; 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       break; 

      case AngleUnits.Turns: 
       if (value >= 0 && value <= 1) 
       { 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       else if (value < 0) 
       { 
        value = value + 1; 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       else if (value > 1) 
       { 
        value = value - 1; 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       break; 
     } 
    } 

回答

2

你有這個錯誤,因爲你可以用一個在switch語句中沒有匹配的angleunits調用這個方法,並且你的方法應該返回一個方法所以編譯器正在檢測這個。

當您關閉switch語句

你應該return a default value

或拋出一個異常

Throw new Exception("no units was found ") 

在這裏你的方法的一個片段

private static decimal Normalize(decimal value, AngleUnits units) 
     { 
      decimal normalizedValue; 

      switch (units) 
      { 
       case AngleUnits.Degrees: 
        if (value >= 0 && value <= 360) 
        { 
         normalizedValue = value; 
         return normalizedValue; 
        } 
        else if (value < 0) 
        { 
         value = value + 360; 
         normalizedValue = value; 
         return normalizedValue; 
        } 
        else if (value > 360) 
        { 
         value = value - 360; 
         normalizedValue = value; 
         return normalizedValue; 
        } 
        break; 

       default: throw new Exception("no Angleunits match was found"); 






      } 
      return value; 


     } 
+0

謝謝你解決了我的問題。 – goku9384

0

您沒有在交換機中處理default的情況。

在我打開enum的情況下,我想在default中輸入InvalidEnumArgumentException。這可以確保,如果將來添加到enum並忘記更新switch語句,我將快速失敗。

0

編譯器關心如果你是變量,會發生什麼開啓功能與您提供的任何情況不匹配。如果發生這種情況,將不會有返回聲明。試試這個來修復它:

private static decimal Normalize(decimal value, AngleUnits units) 
    { 
     decimal normalizedValue; 

     switch (units) 
     { 
      case AngleUnits.Degrees: 
       if (value >= 0 && value <= 360) 
       { 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       else if (value < 0) 
       { 
        value = value + 360; 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       else if (value > 360) 
       { 
        value = value - 360; 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       break; 

      case AngleUnits.Gradians: 
       if (value >= 0 && value <= 400) 
       { 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       else if (value < 0) 
       { 
        value = value + 400; 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       else if (value > 400) 
       { 
        value = value - 400; 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       break; 

      case AngleUnits.Radians: 
       if (value >= 0 && value <= twoPi) 
       { 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       else if (value < 0) 
       { 
        value = value + twoPi; 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       else if (value > twoPi) 
       { 
        value = value - twoPi; 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       break; 

      case AngleUnits.Turns: 
       if (value >= 0 && value <= 1) 
       { 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       else if (value < 0) 
       { 
        value = value + 1; 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       else if (value > 1) 
       { 
        value = value - 1; 
        normalizedValue = value; 
        return normalizedValue; 
       } 
       break; 
     } 
     return null; 
    } 
0

你錯過了交換機的「默認」值。 您正在使用枚舉,並且似乎將開關情況限制爲僅爲您爲枚舉創建的值,但事實並非如此,列舉實際上存儲在數字類型中,默認情況下爲int,但可設置爲byteshortlong。然後,任何數字都可以轉換爲枚舉,即使它超出了您爲其定義的值的範圍,這就是爲什麼您必須處理「默認」值。

相關問題