c# - ReSharper 提示它生成的 switch 语句—— "Cannot resolve symbol ..."

标签 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 似乎会提示它生成的代码,声称​​“无法解析符号‘value’”。这是有道理的,因为 value 是一个局部变量,所以捕获异常消息的消费者不知道 value 到底是什么。

那么,为什么会这样呢?

最佳答案

问题是您使用了错误类型的 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);
    }
}

关于c# - ReSharper 提示它生成的 switch 语句—— "Cannot resolve symbol ...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25669734/

相关文章:

c++ - 在 C++ 中对字符串使用 OR 运算符

c# - 是否有跨平台方法将一个字符串编码为另一个不带任何空格的字符串,然后将其解码回来?

c# - Atata - 如何使用 Atata 框架切换到新的浏览器窗口?

iphone - 理解 Objective c 枚举声明

c# - 将字符串转换回枚举

c++ - 嵌套循环中 goto 的替代方法?

c# - 如何在sqlbulkcopy中设置自动映射

c# - Azure KeyVault 配置提供程序在更改时重新加载值

java - 枚举定义中的静态上下文

html - CSS Toggle Radio 开关定制