C# ReSharper抱怨它生成的switch语句--“0”;无法解析符号…“;

C# ReSharper抱怨它生成的switch语句--“0”;无法解析符号…“;,c#,enums,switch-statement,resharper,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()

我正在使用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似乎不会抱怨它生成的代码。它认识到异常消息中正确使用了

但是,如果我在方法中以其他方式获取局部变量的值,ReSharper似乎会抱怨它生成的代码,声称“无法解析符号‘value’”。这有点道理,因为
是一个局部变量,因此捕获异常消息的消费者不知道
到底是什么

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

参数名应该是一个参数的值:

导致此异常的参数的名称

因此,您应该使用参数的名称,而不是本地名称。即使Resharper生成了它,它也无法进行此更改,除非进行破坏性更改,例如更改异常类型


在这种情况下,更好的异常可能是
invalidoOperationException

问题是您使用了错误的
异常类型。在第二个示例中,
value
不是参数,因此抛出
ArgumentOutOfRangeException
在语义上是错误的。我已经创建了一个自定义的
异常
,以便在这种情况下使用,您也可以出于自己的目的使用它:

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);
    }
}
公共类意外异常:异常
{
public unexpectedumException(类型enumType,对象unexpectedValue)
:base(string.Concat(“意外”,enumType.Name“:”,意外值))
{
}
publicstaticunexpectedumexceptioncreate(TEnum unexpectedValue),其中TEnum:struct,IConvertible,IFormattable,IComparable
{
返回新的意外异常(typeof(TEnum),意外值);
}
}

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