Asegura no comprobado a través de la propiedad al implementar la interfaz

Estoy intentando lo que, para mí, parece un código de contratos bastante básico. Lo he reducido al siguiente problema. Lo siguiente falla el análisis estático, con el mensaje

CodeContracts: garantiza no probado: esto.Congelado

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 } } 

Sin embargo, lo siguiente funciona bien y satisface todos los controles:

 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: Comprobado 1 afirmación: 1 correcta

¿Qué debo hacer para satisfacer el comprobador estático, cuando coloqué mis contratos en la interfaz?

En su implementación de IBasic , StrippedContract , deberá agregar una condición posterior a la propiedad Frozen :

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

Alternativamente, puede agregar la opción de línea de comando -infer al verificador estático en la pestaña Contratos de Código de las propiedades de su proyecto. Eso permitirá que el verificador estático deduzca esto automáticamente.