Контрактный класс должен быть абстрактным классом - PullRequest
7 голосов
/ 04 сентября 2010

Следующий код дает мне предупреждение Contract class 'FooContracts' should be an abstract class.Из всех примеров, которые я читал в Интернете (например, http://www.infoq.com/articles/code-contracts-csharp),, это должно работать (предположительно, без предупреждений компилятора).

[ContractClass(typeof(FooContracts))]
public interface IFoo {
  void Bar(string foo);
}

[ContractClassFor(typeof(IFoo))]
internal sealed class FooContracts : IFoo {
  void IFoo.Bar(string foo) {
    Contract.Requires(foo != null);
  }
}

Я нахожусь в Visual Studio 2010 со следующими настройками вCode Contracts раздел свойств проекта:

  • Выполнение проверки контракта во время выполнения (установлено на Full)
  • Выполнение статической проверки контракта (под Static Checking)
  • Проверка в фоновом режиме

Я также определил символ компиляции CONTRACTS_FULL, чтобы заставить ReSharper замолчать.

Я что-то упускаю, чтобы сделать эту компиляцию без предупреждений?

Ответы [ 2 ]

9 голосов
/ 04 сентября 2010

В разделе 2.8 руководства по контрактам кода конкретно указано, что это должен быть абстрактный класс:

Инструменты ожидают, что класс контракта является абстрактным, и реализуют интерфейс, которым он являетсяпредоставление контрактов на.

3 голосов
/ 04 сентября 2010

Скорее всего, статья InfoQ, на которую вы ссылаетесь, неверна.Он основан на «раннем доступе» C # in Depth, поэтому реализация контрактов кода, вероятно, изменилась между моментом написания главы / статьи и выпуском .NET 4.

Должен работать следующий код:

[ContractClass(typeof(FooContracts))] 
public interface IFoo { 
  void Bar(string foo); 
} 

[ContractClassFor(typeof(IFoo))] 
internal abstract class FooContracts : IFoo { 
  void IFoo.Bar(string foo) { 
    Contract.Requires(foo != null); 
  } 
}

Класс договора должен быть абстрактным.

...