如果有的话,应该在IEnumerable <t>?</t>上使用IEnumerable

时间:2009-07-14 14:11:51

标签: .net generics ienumerable

在下面的示例中,如果使用GetPeople的客户端代码想要将每个人的姓名和年龄打印到控制台,则必须使用反射(我猜)来确定该查询包含IEnumerable(Of Person)然后为了得到它的属性,它就这样投射。

Public Function GetPeople() As IEnumerable
    Dim query = From p As Person In People.AsEnumerable() _
                Select p
    Return query
End Function

IEnumerable的通用形式对客户来说似乎更具信息性和实用性:

Public Function GetPeople() As IEnumerable(Of Person)
    Dim query = From p As Person In People.AsEnumerable() _
                Select p
    Return query
End Function

我确信有一个原因 - 那么,为什么IEnumerable会比IEnumerable(Of T)更受青睐?

感谢。

4 个答案:

答案 0 :(得分:8)

从来没有,据我所见。 IEnumerable<T>继承IEnumerable,因此公开IEnumerable<T>会向调用者传达您对T的了解,同时仍允许在泛型之前编写的函数使用该集合。

非通用IEnumerable存在的原因是历史性的。

答案 1 :(得分:2)

在我处理LINQ查询和匿名对象时,我唯一一次找到IEnumerable超过IEnumerable<T>的位置。考虑以下(人为的)示例:

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

IEnumerable<object> GetFirstNames(IEnumerable<Person> people)
{
    return from p in people
           select new
           {
               Name = p.FirstName
           };
}

这将产生以下错误:

  

错误CS0266:无法隐式   转换类型   'System.Collections.Generic.IEnumerable&LT; AnonymousType#1&GT;'   至   'System.Collections.Generic.IEnumerable&LT;对象&gt;'。   存在显式转换(是你   错过演员?)

但是,如果您将GetFirstNames()的返回类型更改为IEnumerable,则会进行编译。

答案 2 :(得分:0)

如果您没有可用的泛型,即您使用的是.NET 1.1。

答案 3 :(得分:0)

也许,不是作为回报价值。否则,尽可能使用它 - 如果你可以逃脱它。它会使你的代码更加通用,因为IEnumerable是一个更通用的IEnumerable&lt;&gt ;.

例如,考虑一个只打印IEnumerable的nun-null值的通用函数。