0

假设我有以下代码:

public abstract class TemplateBase {
    public void TemplateMethod() {
        Operation(); }

    protected abstract void Operation(); }

public sealed class Implementation : TemplateBase {
    bool _alwaysTrue;

    public Implementation(bool alwaysTrue) {
        _alwaysTrue = alwaysTrue; }

    [ContractInvariantMethod] void ObjectInvariant() {
        Contract.Invariant(_alwaysTrue == true); }


    protected override void Operation() {
        _alwaysTrue = false; } }

[TestClass] public sealed class InvariantTest {
    [TestMethod] public void Constructor() {
        new Implementation(false); }

    [TestMethod] public void Method() {
        new Implementation(true).TemplateMethod(); } }

InvariantTest.Constructor 总是因“Invariant failed”异常而失败。

如何根据不变量让 InvariantTest.Method 失败?

我已将运行时检查设置为完全,甚至启用了“调用站点需要检查”,但即使这样也无济于事。

4

1 回答 1

0

如果您使用最新版本 (1.4.50910.0),您将收到来自静态检查器的警告,即不变量为假。

但对于运行时,这是预期的行为。从手册

在运行时检查期间,在每个公共方法结束时检查不变量。

出于对象不变量的目的,将受保护的覆盖视为“公共”可能是一个很好的案例。您可能想在Code Contracts 论坛上开始讨论。

于 2012-10-16T01:20:23.057 回答