[ContractClass(typeof(MyObjectContract))]public interface IMyObject{ int CountOfItems { get; }}
以下合同:
[ContractClassFor(typeof(IMyObject))]public abstract class MyObjectContract{ int IMyObject.CountOfItems { get { Contract.Ensures(Contract.Result<int>() > 0); return 1; } }}
以下实施:
public class MyObject : IMyObject{ private IEnumerable someEnumerable .... public int CountOfItems { get { return this.someEnumerable.Count(); } }}
现在我收到警告说确保未经证实:Contract.Result< int>()> 0
我怎么能证明计数大于零?我不想在getter中抛出异常,我错过了什么?
谢谢
解决方法 正如其他人所提到的,由于基类库(.NET Framework)和静态检查器的限制,您无法静态证明IEnumerable< T> .Count()返回大于0的值.但是,您可以向静态检查器指示您认为该事实为真.这是您使用基类库解决所有此类合同问题的方法,或静态检查程序无法证明的语句.public int CountOfItems{ get { int count = this.someEnumerable.Count(); Contract.Assume(count > 0); return count; }}总结
以上是内存溢出为你收集整理的c# – 代码合同:如何在财产获取方面满足’确保未经证实’?全部内容,希望文章能够帮你解决c# – 代码合同:如何在财产获取方面满足’确保未经证实’?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)