我正在尝试解决一些fxcop问题,我对这个问题感到很困惑。
在派生类的setter中,我正在检查是否应该进行赋值
if (!(value is TypeA))
{
throw new ArgumentException("value is not of TypeA type");
}
_action = (TypeA)value;
FxCop抱怨道:
' value',一个参数,被转换为' TypeA'方法多次。将结果缓存为' as'运算符或直接强制转换,以消除冗余的转换类指令。
但是,在this msdn示例(is
定义)中,我看到了这一点:
if (o is Class1)
{
Console.WriteLine("o is Class1");
a = (Class1)o;
}
这与我做的完全一样。那么,有解决方案吗?
我能想到的只有:
TypeA tmpAction = value as TypeA;
if(tmpAction == null)
{
throw new ArgumentException();
}
_action = tmpAction;
答案 0 :(得分:4)
TypeA tmpAction = value as TypeA;
if(tmpAction == null)
{
throw new ArgumentException();
}
您提供的示例是正确的 - 如果您需要投射并使用您投射到的类型的变量,请使用as
和null
检查而不是is
,这样您就不会不得不做两次。
答案 1 :(得分:3)
使用as
运算符的解决方案就是您应该做的。请注意,如果TypeA
是值类型,则无法执行此操作,as
仅适用于引用类型。