合约类应该是一个抽象类

发布于 2024-09-17 07:21:50 字数 774 浏览 6 评论 0原文

以下代码向我发出警告Contract 类“FooContracts”应该是一个抽象类。从我在线阅读的所有示例中(例如 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
  • 执行静态合约检查(在静态检查下)
  • 在后台检查

我还定义了CONTRACTS_FULL编译符号以使ReSharper关闭。

我是否缺少一些东西来使这个编译没有警告?

The following code gives me the warning Contract class 'FooContracts' should be an abstract class. From all the examples I've read online (e.g. http://www.infoq.com/articles/code-contracts-csharp), this should work (presumably without compiler warnings).

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

I'm in Visual Studio 2010, with the following settings in the Code Contracts section of the project's properties:

  • Perform Runtime Contract Checking (set to Full)
  • Perform Static Contract Checking (under Static Checking)
  • Check in Background

I also defined the CONTRACTS_FULL compilation symbol to make ReSharper shut up.

Am I missing something to make this compile without warnings?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

娜些时光,永不杰束 2024-09-24 07:21:50

代码合同手册第 2.8 节明确指出,应该一个抽象类:

工具期望合约类是抽象的并实现它提供合约的接口
对于。

Section 2.8 of the code contracts manual specifically states that it should be an abstract class:

The tools expect that the contract class is abstract and implements the interface it is providing contracts
for.

‖放下 2024-09-24 07:21:50

您引用的 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); 
  } 
}

合约类必须是抽象的。

Most likely the InfoQ article you are referencing is incorrect. It's based on an "early access" edition of C# in Depth, so the code contracts implementation probably changed between the time the chapter/article was originally written and .NET 4 was released.

The following code should work:

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

The contract class must be abstract.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文