Кодовые контракты 1.4.40602.0 - Contract.ForВсе не работает? - PullRequest
2 голосов
/ 09 декабря 2011

Warning 1 CodeContracts: requires unproven: Contract.ForAll(coll, item => item != null) C:\MyApp\MyObj.cs

    public MyObj()
        : this(new Collection<Object>()) { }

    public MyObj(ICollection<Object> coll)
    {
        Contract.Requires<ArgumentNullException>(coll != null);
        Contract.Requires<ArgumentException>(Contract.ForAll(coll, item => item!= null));

        _coll = coll;
    }

Я понимаю, что в старых версиях CodeContracts метод Contract.ForAll() не поддерживался, но я думал, что сейчас (версия 1.4.40602.0) это будет?Я просто что-то не так делаю или все еще не поддерживается?

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

У меня нет предупреждений с «Уровень предупреждения», установленным на «низкий» в опциях CC.При значении 'high' я получил предупреждение.

Я пробовал System.Collections.ObjectModel.Collection<T> и System.Collections.Generic.List<T>, и оба выдают одинаковые предупреждения.

Я пробовал оба конструктора иобычные вызовы методов - без разницы.

Я пробовал

public MyObj() : this(new List<Object>()) { }

и

public MyObj() : this(new List<Object>{1}) { }

и опять без разницы.

Извлечение переменнойкогда обычный вызов метода тоже не помогает.

Даже Assume не помог:

public void M1()
{
  var list = new List<Object>
    {
      1
    };
  Contract.Assume(Contract.ForAll(list, t => t != null));
  this.X(list); // Still gives warning on the ForAll requirement
}

public void X(ICollection<object> c)
{
  Contract.Requires<ArgumentNullException>(c != null);
  Contract.Requires<ArgumentException>(Contract.ForAll(c, x => x != null));
}

(я использую тот же CC: 1.4.40602.0 на VS2010SP1)

ОБНОВЛЕНИЕ

Работал с массивом.

Может быть, Иуда Химанго прав насчет отсутствия контрактов на Collection и List.

2 голосов
/ 09 декабря 2011

Я обнаружил, что биты CodeContracts страдают от недостатка интеграции языка и инфраструктуры.

В этом случае передаваемая вами коллекция явно соответствует условию, но либо из-за отсутствия интеграции с языком C # (Code Contracts не понимает, что вы передаете пустую коллекцию через C #),или отсутствие интеграции .NET Framework (класс Collection не аннотирован контрактами кода).

...