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;
}
答
您没有在交换机中处理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
,但可设置为byte
short
或long
。然后,任何数字都可以转换为枚举,即使它超出了您为其定义的值的范围,这就是为什么您必须处理“默认”值。
谢谢你解决了我的问题。 – goku9384