实现接口时,通过属性确保未经证实

时间:2010-09-16 14:03:16

标签: c# .net code-contracts

我正在尝试对我来说,似乎是一些相当基本的代码合同代码。我把它减少到了下面的问题。以下内容未通过静态分析,并显示消息

  

CodeContracts:确保未经证实:   this.Frozen

using System;
using System.Diagnostics.Contracts;

namespace PlayAreaCollection2010
{
    public class StrippedContract : IBasic
    {
        private bool _frozen = false;

        public void Freeze()
        {
            _frozen = true;
        }

        public bool Frozen { get { return _frozen; } }
    }

    [ContractClass(typeof(IBasicContract))]
    public interface IBasic
    {
        void Freeze();
        bool Frozen { get; }
    }

    [ContractClassFor(typeof(IBasic))]
    public abstract class IBasicContract : IBasic 
    {
        #region IBasic Members

        public void Freeze()
        {
            Contract.Ensures(this.Frozen);
        }

        public bool Frozen
        {
            get { return true;}
        }

        #endregion
    }
}

但是,以下工作正常并且满足所有检查:

using System;
using System.Diagnostics.Contracts;

namespace PlayAreaCollection2010
{
    public class StrippedContract
    {
        private bool _frozen = false;

        public void Freeze()
        {
            Contract.Ensures(this.Frozen);
            _frozen = true;
        }

        public bool Frozen { get { return _frozen; } }
    }

}
  

CodeContracts:检查1个断言:1个正确

当我将合同放在界面中时,我需要做些什么来满足静态检查器?

1 个答案:

答案 0 :(得分:3)

IBasicStrippedContract的实施中,您需要在Frozen属性中添加后置条件:

public bool Frozen {
    get {
        Contract.Ensures(Contract.Result<bool>() == this._frozen);
        return _frozen;
    }
}

或者,您可以将-infer命令行选项添加到项目属性的“代码约定”选项卡中的静态检查器中。这将允许静态检查器自动推断它。