2014-09-04 64 views
2

我使用ReSharper的,和我遇到了两种情景生成switch语句时:ReSharper的抱怨它产生的switch语句 - “无法解析符号......”

public void DoWork(MyEnum value) 
{ 
    switch(value) 
    { 
     // ... 

     default: 
      throw new ArgumentOutOfRangeException("value"); 
    } 
} 

public void DoWork() 
{ 
    var value = GetEnumValue(); 

    switch(value) 
    { 
     // ... 

     default: 
      // Cannot resolve symbol 'value' 
      throw new ArgumentOutOfRangeException("value"); 
    } 
} 

似乎如果我将枚举值作为参数传入,ReSharper不会抱怨它生成的代码。它认识到value适用于例外消息。但是,如果我在方法中以某种其他方式获取值作为局部变量,ReSharper似乎会抱怨它生成的代码,声称“无法解析符号”值“”。这种说法是有道理的,因为value是一个局部变量,所以捕获异常消息的用户不知道什么是value

那么,为什么会发生这种情况呢?

+2

为什么不使用自定义异常?如果你没有任何争论,那么抛出一个ArgumentOutOfRange非常奇怪,违反直觉。 – 2014-09-04 15:54:11

+0

自定义异常通常没有正确实现。例如,它们通常不能正确序列化或包含不可序列化类型的字段,当异常尝试跨越AppDomain边界时会导致问题。如果您*执行*自己的例外,我会建议遵循MSDN上的所有细节。 – vcsjones 2014-09-05 11:14:32

回答

4

According to MSDNparamName应该是一个参数的值:

导致该异常的参数的名称。

所以你应该使用一个参数的名称,而不是本地。即使Resharper生成它,但无法进行此更改,而无需进行重大更改,例如更改异常类型。

也许在这种情况下更好的例外是InvalidOperationException

5

问题是您使用的错误类型为Exception。在第二个例子中,value不是一个参数,所以抛出一个ArgumentOutOfRangeException在语义上是错误的。我已经创建自定义Exception在这种情况下使用,欢迎您使用它为您的用途,以及:

public class UnexpectedEnumException : Exception 
{ 
    public UnexpectedEnumException(Type enumType, object unexpectedValue) 
     : base(string.Concat("Unexpected ", enumType.Name, ": ", unexpectedValue)) 
    { 
    } 

    public static UnexpectedEnumException Create<TEnum>(TEnum unexpectedValue) where TEnum : struct, IConvertible, IFormattable, IComparable 
    { 
     return new UnexpectedEnumException(typeof (TEnum), unexpectedValue); 
    } 
}