如果无法实例化接口,LINQ returns IEnumerable<T> 怎么办?

How LINQ returns IEnumerable<T> if interface cannot be instantiated?

我有以下方法:

   public IEnumerable<T> Filter(IEnumerable<T> products, ISpecification<T> specification)
    {
        return products.Where(specification.IsFulfilled);

    }

一切正常,但在编写此方法后我开始怀疑 - 如果无法实例化接口,LINQ return IEnumerable 是如何实现的?我可以用另一种方式 return 这个 IEnumerable 吗?可能我可以使用 foreach 和 yield,但我还是不明白为什么我能够以这种方式 return IEnumerable。 我错过了什么?

这里的基本问题是"how can I return interfaces when they cannot be instantiated?",你当然可以:

public IFruit GetProduce()
{
    return new Apple();
}

这本质上是一样的:您不必实例化接口,您可以 return 实现它的东西。

特别是 IEnumerable<T>,如您所述,yield 也是一个选项。

您可以 return 对接口的引用并具有接口的变量,因为某处将有一个 class 实现该接口。 LINQ 将 return 一个内部 class 实现 IEnumerable 你永远不会知道它是什么,你不应该。