【发布时间】:2011-05-29 02:01:11
【问题描述】:
我有以下代码:
public static IEnumerable<long> GetAllCombinations(IEnumerable<long> elements)
{
Contract.Requires(elements != null);
return GetAllCombinations(elements.ToList(), 0);
}
静态分析现在告诉我添加另一个前提条件:
CodeContracts:建议的前提条件: Contract.Requires(最大值 >= 0)
我不明白这个建议,因为
a) 如果我已经确保 elements 不为 null,我为什么要检查它的计数是否更大或 等于 为零?我的意思是,传递一个非空值已经意味着它至少包含零个元素?
b) 我应该如何检查 IEnumerable 的计数(或建议的最大值)?我看到的唯一方法是将elements.ToList() 分配给一个额外的变量并检查该变量。但是,如果我不想从 IEnumerable 中列出列表呢?
让我感到困惑。
编辑:
我知道IEnumerable<T> 的所有扩展方法,并且非常了解.Any()、.Count() 等。
让我困惑的是来自静态分析器的消息。谁能解释为什么它声明Contract.Requires(maximum >= 0)?
这是否意味着我认为的意思(检查元素数量 >= 0)?
而且,正如评论中提到的,为什么静态分析器仍然对Contract.Requires(elements.Any()); 不满意?
【问题讨论】:
-
如果元素为空,
elements.Any()将失败。这可能是您的问题。 -
@Aren:我还有第一次检查 null,所以这不是问题。
-
静态分析器的启发式分析可能不够智能,无法链接您的合约。我只是在说明人们对
IEnumerable<T>的实现怀念的一个共同点。试试Contract.Requires(elements != null && elements.Any())看看警告是否消失。 -
我认为您正在寻找错误的方法。当 CodeContracts 说“maximum >= 0”时,它指的是这里不存在的参数。 CodeContracts 是否有可能从输出到方法提供了错误的“链接”?
-
@Porges:我开始这么想了。好像静态分析器深入研究了框架源代码并指出了
Enumerable.ToList()的实现中的一些变量。今晚我需要验证一下。
标签: c# c#-4.0 code-contracts