有很多信息,靜態檢查Contract.ForAll
只有有限的或沒有支持。代碼契約 - ForAll - 什麼是靜態驗證支持
我做實驗的很多,發現它可以與工作:
Contract.ForAll(items, i => i != null)
Contract.ForAll(items, p)
其中p
類型爲Predicate<T>
它不能與工作:
- 字段訪問
- 房產訪問
- 方法組(我想委託反正這裏分配)
- 實例方法調用
我問題是:
- 是什麼
ForAll
可以使用的其他類型的代碼? - 代碼合同是否承諾在
Contract.ForAll(items, i => i != null)
被證明後,在代碼中從列表中獲取一個項目(即通過索引)時,該項目不爲空?
下面是完整的測試代碼:
public sealed class Test
{
public bool Field;
public static Predicate<Test> Predicate;
[Pure]
public bool Property
{
get { return Field; }
}
[Pure]
public static bool Method(Test t)
{
return t.Field;
}
[Pure]
public bool InstanceMethod()
{
return Field;
}
public static void Test1()
{
var items = new List<Test>();
Contract.Assume(Contract.ForAll(items, i => i != null));
Contract.Assert(Contract.ForAll(items, i => i != null)); // OK
}
public static void Test2()
{
var items = new List<Test>();
Contract.Assume(Contract.ForAll(items, Predicate));
Contract.Assert(Contract.ForAll(items, Predicate)); // OK
}
public static void Test3()
{
var items = new List<Test>();
Contract.Assume(Contract.ForAll(items, i => i.Field));
Contract.Assert(Contract.ForAll(items, i => i.Field)); // assert unproven
}
public static void Test4()
{
var items = new List<Test>();
Contract.Assume(Contract.ForAll(items, i => i.Property));
Contract.Assert(Contract.ForAll(items, i => i.Property)); // assert unproven
}
public static void Test5()
{
var items = new List<Test>();
Contract.Assume(Contract.ForAll(items, Method));
Contract.Assert(Contract.ForAll(items, Method)); // assert unproven
}
public static void Test6()
{
var items = new List<Test>();
Contract.Assume(Contract.ForAll(items, i => i.InstanceMethod()));
Contract.Assert(Contract.ForAll(items, i => i.InstanceMethod()));// assert unproven
}
}
感謝您的努力,但我的問題是關於Code Contract引擎完成靜態分析的能力。在ForAll函數的代碼中實現的運行時特性並不完全相同。 –