Существует много информации о том, что статическая проверка Contract.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
}
}