让我举一个例子:
假设我有一个方法:
public void DoStuff(IEnumerable<T> sequence)
{
if (/* is lazy sequence */) throw ...
// Do stuff...
}
Run Code Online (Sandbox Code Playgroud)
我想要防范潜在的无限序列.
编辑:
详细说明,防范无限收集只是其中一种用途.正如乔恩所说.你可以轻松拥有无限的IList.好点子.
其他用途可能是检测数据是否可能无法重复.像一个随机发电机.真正的集合已将数据存储在内存中,并且迭代两次将为我提供相同的数据.
什么都没有保证,没有.您可以看到序列是否也实现了IList<T>- 这将禁止迭代器块实现,但仍然可以是永远持续的"虚拟"列表,并且对于其他一些有限的非迭代器块集合也会失败.
就你想要保护的内容而言,一个20亿长的序列是否适合你想要做的事情?如果你最终获得超过一些"限制"(但是这样懒得)的扩展方法会引发异常吗?(像Take这样的东西,但最后爆炸了.)
这是不可能的.
IEnumerable API不可能告诉你它是否是无限的.您可以尝试将其转换为ICollection以捕获有人通过您其中之一的常见情况,但如果这是您想要的,那么为什么不首先采用ICollection <...>对象?