私有执行方法的CodeContract错误CC1025

时间:2013-12-16 10:14:15

标签: c# wpf code-contracts

我有一个Command对象ClickExecute的私有执行方法Command。我正在绑定一个类型为TypeA的参数对象。它有一个属性IsValid,我想在代码合同中检查,如下所示。

ClickCommand = new DelegatingCommand(ClickExecute);

private void ClickExecute(object parameter)
    {
        var typeA= parameter as TypeA;
        Contract.Requires<ArgumentNullException>(typeA!= null, "typeA");
        Contract.Requires<ArgumentException>(typeA.IsValid, "Not Valid");
    }

当我这样做时,我得到编译错误 - error CC1025: After contract block, found use of local variable 'typeA' defined in contract block

我做错了什么?在检查之前我需要进行类型转换

[编辑]

Matthew的回答很有帮助并解决了CodeContract问题 -

        Contract.Requires<ArgumentNullException>(parameter is TypeA);
        Contract.Requires<ArgumentException>((parameter as TypeA).IsValid);
        var typeA = parameter as TypeA;

但是这引入了使用这种方法重复类型转换的新问题并导致静态代码分析错误 -

CA1800 : Microsoft.Performance : 'parameter', a parameter, is cast to type 'TypeA' multiple times in method

有没有更清洁的方法来避免这种情况?

1 个答案:

答案 0 :(得分:2)

[编辑]已更改以适应对OP的编辑

您必须在任何其他代码之前提出所有要求。

所以你必须像这样重写代码:

private void ClickExecute(object parameter)
{
    Contract.Requires<ArgumentException>(parameter is TypeA);
    Contract.Requires<ArgumentException>(((typeA)parameter).IsValid);
}

请注意,我也稍微改变了一些东西 - 你真的不需要为错误信息指定字符串;最好让它输出实际失败的检查代码,默认情况下会这样做。