FxCop对于如何消除冗余的castclass感到困惑

时间:2012-01-01 21:59:01

标签: c# casting fxcop

我正在尝试解决一些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;

2 个答案:

答案 0 :(得分:4)

TypeA tmpAction = value as TypeA;
if(tmpAction == null)
{
    throw new ArgumentException();
}

您提供的示例是正确的 - 如果您需要投射并使用您投射到的类型的变量,请使用asnull检查而不是is,这样您就不会不得不做两次。

答案 1 :(得分:3)

使用as运算符的解决方案就是您应该做的。请注意,如果TypeA是值类型,则无法执行此操作,as仅适用于引用类型。