在下面的示例中,如果使用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)更受青睐?
感谢。
答案 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值的通用函数。