2

这段代码:

private static char GetBarcodeChecksumWithLegacyCode(string barcodeWithoutCzechSum)
{
    Contract.Requires(!string.IsNullOrWhiteSpace(barcodeWithoutCzechSum));
    Contract.Ensures(Contract.Result != null);
    . . .

...不编译(“运算符'!='不能应用于'方法组'和'' ”类型的操作数)。

这以同样的方式失败:

Contract.Ensures(Contract.ValueAtReturn != null);

如何强制使用代码合同返回结果的方法的必要性?

更新

如果我这样做:

Contract.Ensures(Contract.Result<char>() != '');

...它失败了,“空字符文字”

那么这是测试返回的 char val 既非空又非空的方法:

Contract.Ensures(Contract.Result<char>() != null && Contract.Result<char>().ToString() != string.Empty);

...或者空检查是否足够?

顺便说一句,尝试使用 ValueAtReturn 而不是 Result 给了我“方法 'ValueAtReturn' 没有重载需要 0 个参数

更新 2

这段代码:

Contract.Ensures(Contract.Result<String>() != null && Contract.Result<String>() != string.Empty); 

失败:

在 BarcodeCzechDigitTester.Form1.GetBarcodeChecksumWithLegacyCode(System.String) 方法中:检测到使用“System.String”调用 Result,应该是“System.Char”。

(两次)另外:“命令 ""C:\Program Files (x86)\Microsoft\Contracts\Bin\ccrewrite.exe" "@BarcodeCzechDigitTesterccrewrite.rsp"" 以代码 2 退出。 "

...但是将代码更改为此有效:

Contract.Ensures(Contract.Result<char>() != null && Contract.Result<char>().ToString() != string.Empty);
4

2 回答 2

1

你需要像这样:

Contract.Ensures(Contract.Result<string>() != null);
于 2013-09-24T20:34:27.450 回答
1

char 是值类型,不能为空。

char 不是集合(如字符串或数组),它不能为空。

如果您的方法返回条形码校验和数字字符,那么您的合约可以检查校验和字符值,如下所示:

Contract.Ensures ( '0' <= Contract.Result<char>() && Contract.Result<char>() <= '9' );
于 2013-12-26T00:24:43.767 回答