CC建议冗余保证

Mar*_*tin 5 c# code-contracts

我有一段看起来像这样的代码:

public TReturn SubRegion(TParam foo)
{
    Contract.Requires(foo!= null);
    Contract.Ensures(Contract.Result<TReturn>() != null);

    if (!CheckStuff(foo))
        foo.Blah();
    return OtherStuff(foo);
}
Run Code Online (Sandbox Code Playgroud)

CC正在给我一个警告:

警告301 CodeContracts:考虑添加后置条件Contract.Ensures(Contract.Result()!= null); 为库客户提供额外的文档

这显然是多余的!我有几个这样的冗余警告,它正在成为一个问题(真正的警告被埋没在多余的冗余建议中).

所以我有两个问题:

1)我错过了什么意味着这不是一个多余的建议吗?在这种情况下,我需要做些什么来修复此警告?

2)或者,如果这只是CCCheck的一个怪癖并且无法修复,我如何隐藏或抑制此警告?

注:万一你觉得我的例子缺少一些重要的东西,全部代码是区域SubRegion1方法在这里.

Pho*_*log 1

关于2:文档相当不错,看看6.6.10过​​滤警告消息

要指示静态协定检查器不要针对方法(类型、程序集)发出特定类别的警告,请使用以下属性注释该方法(类型、程序集):

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Contracts", warningFamily)]
Run Code Online (Sandbox Code Playgroud)

其中 warningFamily 是以下之一:Requires, Ensures, Invariant, NonNull, ArrayCreation, ArrayLowerBound, ArrayUpperBound, DivByZero, MinValueNegation.

如有必要,静态合同检查器还允许过滤单个警告消息(而不是整个系列)。为此,您可以使用属性注释方法

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Contracts", warningFamily-ILOffset-MethodILOffset)]
Run Code Online (Sandbox Code Playgroud)

其中warningFamily和 如上所述, 和ILOffsetMethodILOffset静态合约检查器用来确定警告所指的程序点。通过在 VS 窗格的“自定义选项”条目中提供 -outputwarnmasks 开关,可以从静态合同检查器获取偏移量。检查构建输出窗口以获取必要的信息。