请假设我有以下扩展方法,以便能够强制评估IEnumerable
:
public static List<T> EvaluateNow<T>(this IEnumerable<T> collection)
{
if (collection == null)
{
throw new ArgumentNullException("collection");
}
else
{
return (collection.ToList());
}
}
我想问一下,使用IList<T>
而不是List<T>
作为此方法的返回类型(即向下转换为接口)是否有任何意义,以便将它或它的依赖关系都绑定到一个特定的实现(即使返回值实际上总是List
)。
答案 0 :(得分:3)
总是 在这种情况下使用接口而不是类是个好主意。
原因太多,无法进入这里,但是,例如,它大大增加了灵活性,因为任何类只需要实现接口IList<T>
可分配给该函数的返回值。类将实现此(或其他)接口,而无需子类化List(或等效的)
通常,您希望使用符合要求的“最低”的层次界面。在这种情况下,您可以考虑ICollection,甚至IEnumerable而不是IList。
与函数返回的类实例无关,因为只返回“接口”,因此可以将其分配给实现该接口的任何类(同样,max flexibilty?)
返回一些IEnumerable对象的函数通常会在foreach循环中使用。
答案 1 :(得分:1)
只能在实例上调用扩展方法。这意味着您的方法collection
永远不会是null
。
所以......如你所说,你的方法与扩展方法IEnumerable.ToList
具有完全相同的行为,所以我没有看到任何意义。
如果Aaron在his answer中解释其返回类型为IList
会很有用。
为什么IEnumerable.ToList
尚未返回IList
对于图书馆设计师来说是一个很好的问题。