C# ReSharper抱怨它生成的switch语句--“0”;无法解析符号…“;
我正在使用ReSharper,在生成switch语句时遇到了两种情况: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()
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上的所有详细信息。