如何为返回类型为枚举的方法返回null?

时间:2014-12-30 08:47:05

标签: c# .net enums return-type

我有一个有一些值的枚举

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的最佳方法是什么?

即使我查找了以下问题,但我没有得到解决方案的答案

3 个答案:

答案 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;