我的代码中有这样的东西。现在,该方法假定返回一个枚举类型。但是,并非所有代码路径都返回值。我想解决这个问题,同时我希望调试器提醒我(即(断言万一它进入 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
}
}
您有以下几种选择:
-
引发异常。当您知道输入无效时(例如,由于调用代码中的错误(,这是合适的。
throw new InvalidOperationException("Cannot convert from Q to MyEnum.");
-
使用可为空的类型。当操作没有有效结果时(例如,由于无效的用户输入或不是错误的情况(,这是合适的。
private MyEnum? AdjustType(object q) { // ... else return null; }
向 枚举添加一个
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.
// ...
}
我只会抛出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
传播。(这取决于您的上下文。
您始终可以使用枚举的可为空版本:
private enumType? AdjustType(someo_object q)