我在包含代碼合同的以下代碼中收到一些警告。代碼合同:IEnumerable.Min上的靜態檢查失敗
public static int Min(IEnumerable<int> set)
{
Contract.Requires(set != null);
Contract.Requires(set.Any());
Contract.Ensures(Contract.ForAll(set, x => x >= Contract.Result<int>()));
int min = set.Min();
return min;
}
static void Main(string[] args)
{
Console.WriteLine(Min(new int[] {3,4,5}));
Console.WriteLine(Min(new int[] {})); // should fail
}
我得到以下警告:
Requires unproven: set.Any() on Min(new int[] {3,4,5})
Ensures unproven: Contract.ForAll(set, x => x > Contract.Result<int>())
兩個問題:
我的後置狀態x> = Contract.Result(),但 「保證未經證實的」 警告狀態x> Contract.Result()。 (更偉大或平等與更好)這是怎麼發生的?
爲什麼不能在上面的語句中證明set.Any()?
在此先感謝您。
'new int [] {3,4,5}'語句在運行時執行。在編譯時,合同檢查器無法知道* set *的內容,所以它無法驗證該集合是否包含任何數據,更不用說Min()可以返回有意義的結果 –
謝謝。我添加了Contract.Assume(arr!= null && arr.Any());在將數組傳遞給Min()之前。但我仍然不知道爲什麼確保失敗,爲什麼警告聲明(x> Contract.Result())而不是(x> = Contract.Result())如代碼中所述。 – mbue
如果您將IEnumerable設置更改爲int [],則檢查程序成功... –