我有以下方法:
public IEnumerable<T> Filter(IEnumerable<T> products, ISpecification<T> specification)
{
return products.Where(specification.IsFulfilled);
}
一切正常,但在编写这个方法之后我开始怀疑 - 如果接口无法实例化,LINQ如何返回IEnumerable?我能以另一种方式返回这个IEnumerable吗?可能我可以使用foreach和yield,但我又不明白为什么我能够以这种方式返回IEnumerable。 我错过了什么?
答案 0 :(得分:3)
这里的基本问题是&#34;当无法实例化界面时如何返回界面?&#34;当然,你可以:
public IFruit GetProduce()
{
return new Apple();
}
这基本上是一回事:你不必实例化界面,你可以返回实现它的东西。
特别针对IEnumerable<T>
,正如您所提到的,yield
也是一种选择。
答案 1 :(得分:1)
您可以返回对接口的引用并具有接口的变量,因为某处将有一个实现接口的类。 LINQ将返回一个实现IEnumerable
的内部类,你将永远不知道它是什么,不是你。