0

也许我不是在摸索代码合同,而是 ISTM 认为这段代码:

private static char GetBarcodeChecksumWithLegacyCode(string barcodeWithoutCzechSum)
{
    Contract.Requires(!string.IsNullOrWhiteSpace(barcodeWithoutCzechSum));
    Contract.Ensures(Contract.Result<char>() != null && Contract.Result<char>().ToString().Trim() != string.Empty); // <-- should fail if length of arg less than 6, which would return a "space" char (' ')

    if (barcodeWithoutCzechSum.Length > 6)
    {
        . . .
        var ch = (char)(48 + b);
        return ch;
    }
    return ' ';
}

...在某些情况下,它返回一个 char ' ',它在“Ensure”中被转换为一个空字符串,不会导致合同检查器犹豫或尖叫。不应该吗?

更新

好吧,我误解了代码合同应该发生的事情——我以为他们会在编译时告诉我我的合同有失败的危险。

实际上,它们是在运行时失败时发出尖叫声的。当我将有效的 arg 传递给方法时,没问题;但是,当我传递一个太短的字符串(少于 6 个字符)时,它告诉我:“*System.Diagnostics.Contracts.__ContractsRuntime.ContractException 未处理 HResult=-2146233088 Message=Postcondition failed: Contract.Result()。 ToString().Trim() != string.Empty*"

4

0 回答 0