ReSharper抱怨它生成的switch语句 - "无法解析符号......"

时间:2014-09-04 15:45:57

标签: c# enums switch-statement resharper

我正在使用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似乎会抱怨它生成的代码,声称​​"无法解析符号'值&#39 ;" 。这种情况很有意义,因为value是一个局部变量,因此捕获异常消息的消费者不知道value究竟是什么。

那么,为什么会这样呢?

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:4)

According to MSDN paramName应该是参数的值:

  

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

所以你应该在那里使用参数的名称,而不是本地的。即使Resharper生成了它,它也无法进行这种更改,而不是在不做更改,例如更改异常类型。

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