gpt4 book ai didi

c# - 代码契约(Contract) : Require an IEnumerable to be non-empty

转载 作者:太空宇宙 更新时间:2023-11-03 16:49:39 26 4
gpt4 key购买 nike

我有以下代码:

public static IEnumerable<long> GetAllCombinations(IEnumerable<long> elements)
{
Contract.Requires(elements != null);
return GetAllCombinations(elements.ToList(), 0);
}

静态分析现在告诉我添加另一个先决条件:

CodeContracts: Suggested precondition: Contract.Requires(maximum >= 0)

我不明白这个建议,因为

a) 如果我已经确保 elements 不为空,我为什么要检查它的计数是否大于或等于为零?我的意思是,传递一个非空值就意味着它至少包含零个元素?

b) 我应该如何检查 IEnumerable 的计数(或建议的最大值)?我看到的唯一方法是分配 elements.ToList()到一个额外的变量并检查该变量。但是,如果我不想从 IEnumerable 中创建一个列表呢?

让我感到困惑。

编辑:

我知道 IEnumerable<T> 的所有扩展方法并且很清楚.Any() , .Count()等等

令我困惑的是来自静态分析器的消息。任何人都可以解释为什么它声明 Contract.Requires(maximum >= 0)

它的意思和我想的一样吗(检查元素的数量 >= 0)?

并且,如评论中所述,为什么静态分析器仍然对 Contract.Requires(elements.Any()); 不满意? ?

最佳答案

我不确定为什么静态分析建议检查集合的计数。如果传递了一个空集合,评估它的代码将不会执行(即 foreach 语句),这应该没问题。也许这与 Count 有关集合是签名类型?您可能想尝试用 Contracts.Assume(elements.Any()) 之类的东西来满足静态分析器的要求。或声明计数为非负数的语句。

要解决您的第二个问题,有很多方法可以确定 IEnumerable<> 是否为结构是非空的。列出一些,由 System.Linq 启用命名空间:

  • elements.Any()//检查是否存在至少一个元素,O(1)。
  • elements.Count()//统计所有元素,O(n)
  • elements.Single()//如果存在多个元素,则引发异常,O(1)。
  • elements.First()//返回第一个元素,如果为空则抛出异常,O(1)。

以下两个变体等同于 elements.Any(),其中 T 是容器中元素的类型:

  • elements.SingleOrDefault() != default(T)
  • elements.FirstOrDefault() != default(T)

关于c# - 代码契约(Contract) : Require an IEnumerable to be non-empty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4503934/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com