在 Code Contracts 中指定一个参数 "may be null or not null"?

Specify a parameter "may be null or not null" in Code Contracts?

我可能遗漏了一些东西,或者我可能向 CC 索要了一些我不应该的东西,但是 -

有没有一种方法可以指定参数 "may or may not be null" 而不会显得完全多余?

例如,想象一下这个人为的例子:

string F(string x)
{
    Contract.Requires(x == null || x != null);
    return x ?? "Hello world!";
}

综上所述,ccchecker好心告知冗余:

CodeContracts: Suggested requires: This precondition is redundant: Consider removing it.


更新: Matt Burland 总结了意图,如果这改变了任何回应,

[What the] OP wants to be able to do is make a note that they didn't forget about adding a requirement ..

如果要求值可以是任何值,那么就什么都不要求,而不是明确添加值可以是任何值的要求。

代码契约不需要被告知参数可以是 null用户 需要被告知参数可以是 null。为此,您有 XML 文档评论:

/// <param name="x">
/// <para>The string...</para>
/// <para>-or-</para>
/// <para><see langword="null"/> if ...</para>
/// </param>
/// <returns>
/// <para><paramref name="x"/> if it is not <see langword="null"/>.</para>
/// <para>-or-</para>
/// <para>The string <c>Hello World!</c> if <paramref name="x"/> is <see langword="null"/>.</para>
/// </returns>

可以 使用代码合同来完成,但不能使用 Require。对于 require,检查器总是警告它是多余的:即使冗余是 "correct" 意图,但它表达不正确。

相反,Assert 可以使用,因为它的处理方式略有不同,不会 引起警告。 (但是我找不到记录此警告行为差异的位置。)

这告诉检查器该条件即使是重言式也应该为真并且 静态验证。生成的运行时工件也存在细微差异(如果有的话),但这解决了问题的目标。

string F(string x)
{
    // No Requires as there is no external restriction on x
    // .. but we can still ask the analyzer to play along.
    Contract.Assert(x == null || x != null);
    return x ?? "Hello world!";
}