C#方法并非所有代码路径都返回一个值
我正在创建以下方法,该方法返回一个标准化的十进制值。AngleUnits是包含度、梯度、弧度和转角的枚举。然而,在实现了这段代码之后,我得到了“Angle.Normalize(…)并不是所有的代码路径都返回一个值”。当我返回十进制值时,我不确定这里缺少了什么。提前谢谢C#方法并非所有代码路径都返回一个值,c#,C#,我正在创建以下方法,该方法返回一个标准化的十进制值。AngleUnits是包含度、梯度、弧度和转角的枚举。然而,在实现了这段代码之后,我得到了“Angle.Normalize(…)并不是所有的代码路径都返回一个值”。当我返回十进制值时,我不确定这里缺少了什么。提前谢谢 private static decimal Normalize(decimal value, AngleUnits units) { decimal normalizedValue; s
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
。然后,任何数字都可以强制转换为枚举,即使它超出了为其定义的值的范围,这就是为什么必须处理“默认”值的原因