我正在使用 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/