界面向下转换

时间:2011-10-01 13:11:23

标签: c# .net interface downcast

请假设我有以下扩展方法,以便能够强制评估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)。

2 个答案:

答案 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对于图书馆设计师来说是一个很好的问题。