不能在 ContractClass 中使用 ContractAbbreviator?

Cannot use ContractAbbreviator in ContractClass?

我刚刚开始使用 and found that the ContractAbbreviator 属性,可以用简洁的方式描述合同。

但是,我无法在摘要 class 的合同 class 中使用它。

鉴于这个简单 class:

[ContractClass(typeof(MyContractClass))]
internal abstract class MyClass
{
    public abstract int Position { get; }

    public abstract void Reset();
}

我想写一份合同class确保:

所以,我想出了这个合同 class:

[ContractClassFor(typeof(MyClass))]
internal abstract class MyContractClass : MyClass
{
    internal MyContractClass()
    {
        this.EnsuresInitialState();
    }

    public override int Position
    {
        get
        {
            Contract.Ensures(Contract.Result<int>() >= 0);
            return default(int);
        }
    }

    public override void Reset()
    {
        this.EnsuresInitialState();
    }

    [ContractAbbreviator]
    private void EnsuresInitialState()
    {
        Contract.Ensures(this.Position == 0);
    }
} 

但是,编译时出现以下错误:

Contract class MyContractClass references member MyContractClass.EnsuresInitialState which is not part of the abstract class/interface being annotated.

这是否意味着无法在合同中使用ContractAbbreviator方法class,还是我这里做错了什么?

在这个简单的 class 中,使用缩写词真的没有意义,因为要确保的状态只是一个 属性。然而,在我的真实 class 中,还有其他几个属性我想确保恢复到它们的初始值。

我正在使用 Visual Studio 2013 更新 4。

EnsuresInitialState 方法移至摘要 class 并将其标记为受保护。然后在调用它的抽象class中添加一个默认构造函数:

[ContractClass(typeof(MyContractClass))]
internal abstract class MyClass
{
    protected MyClass()
    {
        EnsuresInitialState();
    }

    [ContractAbbreviator]
    protected void EnsuresInitialState()
    {
        Contract.Ensures(Position == 0);
    }

    public abstract int Position { get; }

    public abstract void Reset();
}

[ContractClassFor(typeof(MyClass))]
internal abstract class MyContractClass : MyClass
{
    public override int Position
    {
        get
        {
            Contract.Ensures(Contract.Result<int>() >= 0);
            return default(int);
        }
    }

    public override void Reset()
    {
        EnsuresInitialState();
    }
}