【问题标题】:ReSharper complains about the switch statement it generated -- "Cannot resolve symbol ..."ReSharper 抱怨它生成的 switch 语句——“无法解析符号……”
【发布时间】:2014-09-04 15:45:57
【问题描述】:

我在使用 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 到底是什么。

那么,为什么会这样呢?

【问题讨论】:

  • 为什么不使用自定义异常?如果您没有任何论据,则抛出 ArgumentOutOfRange 非常奇怪且违反直觉。
  • 自定义异常通常没有正确实现。例如,它们通常没有正确序列化或包含不可序列化类型的字段,当您的异常尝试跨越 AppDomain 边界时会导致问题。如果您确实实现了自己的异常,我建议您遵循 MSDN 上的所有详细信息。

标签: c# enums switch-statement resharper


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    在这种情况下,一个更好的例外可能是InvalidOperationException

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 2012-03-03
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      相关资源
      最近更新 更多