我有一个有一些值的枚举
public enum CompareOperators
{
GreaterThan,
LessThan,
GreaterThanEqualTo,
LessThanEqualTo,
EqualTo,
NotEqualTo
}
我有一个方法可以为各种条件返回此枚举
public static CompareOperators GetTypeForOperator(string strType)
{
switch (strType)
{
case "=":
return CompareOperators.EqualTo;
case "!=":
return CompareOperators.NotEqualTo;
case ">":
return CompareOperators.GreaterThan;
case "<":
return CompareOperators.LessThan;
case ">=":
return CompareOperators.GreaterThanEqualTo;
case "<=":
return CompareOperators.LessThanEqualTo;
}
return null;
}
编译时出现以下错误
Cannot convert null to CompareOperators because it is not a non-nullable value type
在null
语句中没有满足条件时,返回switch
的最佳方法是什么?
即使我查找了以下问题,但我没有得到解决方案的答案
答案 0 :(得分:5)
让您的方法返回可为空的CompareOperators
:
public static CompareOperators? GetTypeForOperator(string strType)
类型名称后面的?
使其可以为空。使用它的另一个选择,是相同的:
public static Nullable<CompareOperators> GetTypeForOperator(string strType)
请参阅MSDN on Using Nullable Types。
另一个选项,如前所述,它会抛出异常或返回'{1}}这样的'默认'值,但这完全取决于你。最好的解决方案是基于您的要求和首选的写作风格。
最终结果:
CompareOperators.Unknown
(之后检查为空):
public static CompareOperators? GetTypeForOperator(string strType)
{
switch (strType)
{
case "=":
return ...
default:
return null;
}
}
或者:
var x = GetTypeForOperator("strType");
if (x != null)
{ ... }
或者:
public static CompareOperators GetTypeForOperator(string strType)
{
switch (strType)
{
case "=":
return ...
default:
return CompareOperators.Unknown;
}
}
答案 1 :(得分:4)
在这种情况下你不应该返回null,而是在default
块
switch (strType)
{
//...other cases
default:
throw new InvalidOperationException("Unrecognized comparison mode");
}
由于没有正确的参数,您无法继续,并且当程序面临意外情况时,例外意味着这种情况。
答案 2 :(得分:0)
您可以使用未定义的比较扩展您的枚举
public enum CompareOperators
{
Undefined,
GreaterThan,
然后将其作为默认值/后备值
返回return CompareOperators.Undefined;