C#方法不是所有的代码路径都返回一个值

问题描述:

我正在创建下面的方法,它返回一个标准化的十进制值。 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; 
     } 
    } 

你有这个错误,因为你可以用一个在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

您没有在交换机中处理default的情况。

在我打开enum的情况下,我想在default中输入InvalidEnumArgumentException。这可以确保,如果将来添加到enum并忘记更新switch语句,我将快速失败。

编译器关心如果你是变量,会发生什么开启功能与您提供的任何情况不匹配。如果发生这种情况,将不会有返回声明。试试这个来修复它:

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

你错过了交换机的“默认”值。 您正在使用枚举,并且似乎将开关情况限制为仅为您为枚举创建的值,但事实并非如此,列举实际上存储在数字类型中,默认情况下为int,但可设置为byteshortlong。然后,任何数字都可以转换为枚举,即使它超出了您为其定义的值的范围,这就是为什么您必须处理“默认”值。