检查IEnumerable <T>是否由yield关键字创建的正确方法

Pab*_*ney 3 c# ienumerable

检查IEnumerable<T>yield关键字是否生成的正确方法是什么?

样品:

public IEnumerable<int> GetMeSomeInts() 
{
   // Unknown implementation
}
Run Code Online (Sandbox Code Playgroud)

某处:

IEnumerable<int> someInts = GetMeSomeInts() ;

if (someInts is generatedbyayield) // <- What should be this condition ? 
      someInts = someInts.ToList() ; 
Run Code Online (Sandbox Code Playgroud)

Hei*_*nzi 5

由yield关键字创建的状态机不是"可检测的".如果您找到一种方法来检测它,您将不得不依赖于某些特定于实现的提示(例如类型名称的特定模式;您的问题的注释中给出了一些示例),这些不是C#的一部分spec,因此,可能随时改变.

因此,没有正确的方法来检查IEnumerable<T>yield关键字是否生成了一个.我认为正确的方法是不检查.这就是接口的用途:它们隐藏了实现.


既然你没有提到为什么你想知道IEnumerable是否是由yield关键字生成的,我会猜测并假设你真正想要问的是:

如果IEnumerable尚未实现,我怎样才能实现?

这个问题已经得到了回答:

  • 接受的答案是检查它是否是`IList <T>`,最好检查它是否是`ICollection <T>`这是父接口. (2认同)