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

时间:2017-07-26 20:13:45

标签: c#

我正在创建以下方法,该方法返回一个标准化的十进制值。 AngleUnits是一个包含Degrees,Gradians,Radians和Turns的枚举。但是在实现此代码后,我得到“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;
        }
    }

4 个答案:

答案 0 :(得分:2)

你有这个错误,因为你可以用一个在switch语句中没有匹配的角度单元来调用这个方法,你的方法应该返回一个方法所以编译器正在检测它。

关闭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; 


        }

答案 1 :(得分:0)

您未在交换机中处理default案例。

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

答案 2 :(得分:0)

编译器担心如果您打开的变量与您提供的任何情况不匹配会发生什么。如果发生这种情况,则不会触发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;
     }

答案 3 :(得分:0)

你错过了&#34;默认&#34;开关的值。 您正在使用枚举,并且似乎将开关案例仅限制为您为枚举创建的值,但这不是真的,枚举实际上存储在数字类型中,默认情况下\K但可以设置为\w+ $my_string = 'Auth code: 02452A</div>'; preg_match("~Auth code:\s*\K\w+~",$my_string, $m); print_r($m[0]); // => 02452A int。然后,任何数字都可以转换为枚举,即使它超出了您为其定义的值范围,这就是为什么您必须处理&#34;默认&#34;值。