如果无法实例化接口,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
你永远不会知道它是什么,你不应该。
我有以下方法:
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
你永远不会知道它是什么,你不应该。