7

次のコードは私に警告を与えます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);
  }
}

私はVisualStudio2010を使用しておりCode Contracts、プロジェクトのプロパティのセクションに次の設定があります。

  • ランタイムコントラクトチェックを実行します(に設定Full
  • 静的コントラクトチェックを実行します(の下Static Checking
  • バックグラウンドでチェックイン

CONTRACTS_FULLまた、 ReSharperをシャットダウンするためのコンパイルシンボルを定義しました。

警告なしにこのコンパイルを行うための何かが欠けていますか?

4

2 に答える 2

9

コードコントラクトマニュアルのセクション2.8には、抽象クラスである必要があると具体的に記載されています。

ツールは、コントラクトクラスが抽象的であり、コントラクトを提供するインターフェイスを実装することを想定しています。

于 2010-09-04T01:15:31.613 に答える
3

参照しているInfoQの記事が正しくない可能性があります。これは、DepthのC#の「早期アクセス」エディションに基づいているため、コードコントラクトの実装は、章/記事が最初に作成されてから.NET4がリリースされるまでの間に変更された可能性があります。

次のコードが機能するはずです。

[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); 
  } 
}

コントラクトクラスは抽象である必要があります。

于 2010-09-04T01:23:41.960 に答える