合同类别应为抽象类别

问题描述:

以下代码给出了警告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闭嘴。

我错过了什么使这个编译没有警告?

code contracts manual 2.8明确规定,它应该是一个抽象类:

的工具想到的是,合同是一个抽象类并实现它提供的合同 的接口。

+1

呵呵。感谢您的链接。这个事实在我发现的任何示例代码中从未被提及和证明。 – tmont 2010-09-04 01:22:09

最有可能是您引用的InfoQ文章不正确。它基于深度C#的“早期访问”版本,因此代码合同的实现可能在章节/文章最初编写和.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); 
    } 
} 

合同类必须是抽象的。

+0

但是使这个类抽象意味着你不能在实现接口后创建新的接口:(除此之外的任何替代方法?其他方法创建一个从抽象类继承的新的具体类? – bitek 2013-12-31 10:47:01

+1

@MnemonicFlow你不应该创建无论如何都是合同类别,只能由代码合约引擎使用。 – piedar 2016-02-25 21:53:19