合同类别应为抽象类别
问题描述:
以下代码给出了警告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闭嘴。
我错过了什么使这个编译没有警告?
答
最有可能是您引用的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);
}
}
合同类必须是抽象的。
呵呵。感谢您的链接。这个事实在我发现的任何示例代码中从未被提及和证明。 – tmont 2010-09-04 01:22:09