c# – 为什么不能证明这个合同断言?
发布时间:2020-12-16 01:45:59 所属栏目:百科 来源:网络整理
导读:我有一个看起来像这样的类: class Foo{ private IEnumerableBar bars; ... private void DoSomething() { Contract.Requires(bars != null); Contract.Requires(bars.Any()); Bar result = bars.FirstOrDefault(b = SomePredicate) ?? bars.First(); Contra
我有一个看起来像这样的类:
class Foo { private IEnumerable<Bar> bars; ... private void DoSomething() { Contract.Requires(bars != null); Contract.Requires(bars.Any()); Bar result = bars.FirstOrDefault(b => SomePredicate) ?? bars.First(); Contract.Assert(result != null); // This asserts fails the static checker as "cannot be proven" } } 据我所知,Contracts拥有它需要知道的所有信息,结果不会为空.酒吧至少有一个元素.如果其中一个元素与SomePredicate匹配,则结果将是第一个这样的元素.如果没有,结果将是条形图中的第一个元素. 为什么断言失败了? 解决方法
您尚未确定或假设栏内的元素不为空.尝试:
Contract.ForAll(bars,x => x != null); 或者(你的实际不变量): Contract.Requires(bars.FirstOrDefault(x => SomePredicate(x)) != null || bars.First() != null); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |