0

我的代码中有这样的东西。现在该方法假设返回一个枚举类型。但是,并非所有代码路径都返回一个值。我想解决这个问题,同时我希望调试器提醒我(即)断言没有枚举类型可以返回,以防它进入 else (代码中的第三个条件)。通常我会为 else 条件添加另一个枚举类型并检查返回值,但我想知道是否有更好的方法来执行此操作。

        private enumType AdjustType(someo_object q)
        {
            if(q.val.Equals("M"))
            {
                return enumType.FirstType;
            }
            else if (q.val.Equals("N"))
            {
                return enumType.SecondType;
            }
            else
            {
                return null; //This isnt allowed - I would like something like an assertion here
            }
        }
4

3 回答 3

2

我只想扔ArgumentException- 并且可能通过开关来做:

private enumType AdjustType(someo_object q)
{
    switch (q.val)
    {
        case "M": return enumType.FirstType;
        case "N": return enumType.SecondType;
        default : throw new ArgumentException(...);
    }
}

我个人更喜欢这个而不是使用Debug.Assert- 无论如何你都必须返回一些东西,然后当在发布版本中关闭断言时错误可能会传播。

另一种选择是只拥有一个Dictionary<string, enumType>- 你可能会很高兴让KeyNotFoundException传播。(这取决于您的上下文。)

于 2013-02-25T20:16:41.427 回答
2

你有几个选择:

  1. 抛出异常。当您知道输入无效(例如由于调用代码中的错误)时,这是合适的。

    throw new InvalidOperationException("Cannot convert from Q to MyEnum.");
    
  2. 使用可为空的类型。当操作没有有效结果时(例如,由于无效的用户输入或不是错误的情况),这是合适的。

    private MyEnum? AdjustType(object q)
    {
        // ...
        else
            return null;
    }
    
  3. 向枚举添加一个None值并返回:

    public enum MyEnum
    {
        None = 0,
        First,
        Second
    }
    

(请注意,始终建议添加这样的值,可以在此处阅读。)


如果传入参数的某些值对您的方法永远无效,则应在方法的开头检查这些值,并ArgumentException在该值无效时抛出或其派生类之一。然后你可以假设你的方法的其余部分传入的值是有效的,这使你的代码更清晰。这就是我喜欢编写此类方法的方式:

private MyEnum AdjustType(object q)
{
    #region Contract
    if (q == null)
        throw new ArgumentNullException("q");
    if (q.Value != "M" && q.Value != "N")
        throw new ArgumentException("Value must be M or N.", "q");
    #endregion

    // Here all incoming arguments are valid and within range.
    // ...
}
于 2013-02-25T20:19:30.003 回答
1

您始终可以使用枚举的可为空版本:

private enumType? AdjustType(someo_object q)
于 2013-02-25T20:16:27.740 回答