C#方法并非所有代码路径都返回一个值

C#方法并非所有代码路径都返回一个值,c#,C#,我正在创建以下方法,该方法返回一个标准化的十进制值。AngleUnits是包含度、梯度、弧度和转角的枚举。然而,在实现了这段代码之后,我得到了“Angle.Normalize(…)并不是所有的代码路径都返回一个值”。当我返回十进制值时,我不确定这里缺少了什么。提前谢谢 private static decimal Normalize(decimal value, AngleUnits units) { decimal normalizedValue; s

我正在创建以下方法,该方法返回一个标准化的十进制值。AngleUnits是包含度、梯度、弧度和转角的枚举。然而,在实现了这段代码之后,我得到了“Angle.Normalize(…)并不是所有的代码路径都返回一个值”。当我返回十进制值时,我不确定这里缺少了什么。提前谢谢

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;
        }
    }
私有静态十进制规格化(十进制值,角度单位)
{
十进制标准化值;
开关(单位)
{
外壳角度单位。度:
如果(值>=0&&360)
{
价值=价值-360;
标准化值=值;
返回规范化值;
}
打破
案例角度单位。梯度单位:
如果(值>=0&&400)
{
数值=数值-400;
标准化值=值;
返回规范化值;
}
打破
外壳角度单位。弧度:
if(值>=0&&value-twoPi)
{
value=value-twoPi;
标准化值=值;
返回规范化值;
}
打破
箱子角度单位。转弯:
如果(值>=0&&1)
{
值=值-1;
标准化值=值;
返回规范化值;
}
打破
}
}

您没有处理开关中的
默认情况


在打开
enum
时,我喜欢在
默认值中抛出
InvalidEnumArgumentException
。这确保了如果我将来添加到
enum
,而忘记更新switch语句,我将很快失败。

您出现此错误,因为您可以使用switch语句中不匹配的angleunits调用此方法,并且您的方法应返回一个方法,因此编译器正在检测此错误

当您关闭switch语句时

您应该
返回一个默认值

或者抛出异常

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&&360)
{
价值=价值-360;
标准化值=值;
返回规范化值;
}
打破
默认值:抛出新异常(“未找到任何Angleunits匹配”);
}
返回值;
}

编译器关心的是,如果您打开的变量与您提供的任何情况不匹配,将会发生什么情况。如果发生这种情况,将不会命中任何return语句。尝试以下方法来解决此问题:

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&&360)
{
价值=价值-360;
标准化值=值;
返回规范化值;
}
打破
案例角度单位。梯度单位:
如果(值>=0&&400)
{
数值=数值-400;
标准化值=值;
返回规范化值;
}
打破
外壳角度单位。弧度:
if(值>=0&&value-twoPi)
{
value=value-twoPi;
标准化值=值;
返回规范化值;
}
打破
箱子角度单位。转弯:
如果(值>=0&&1)
{
值=值-1;
标准化值=值;
返回规范化值;
}
打破
}
返回null;
}
您缺少开关的“默认”值。 您正在使用一个枚举,它似乎将开关大小写限制为仅为枚举创建的值,但事实并非如此,枚举实际上是以数字类型存储的,默认情况下
int
,但可以设置为
byte
short
long
。然后,任何数字都可以强制转换为枚举,即使它超出了为其定义的值的范围,这就是为什么必须处理“默认”值的原因