![](/img/trans.png)
[英]Why does IEnumerable<T>.ToList<T>() return List<T> instead of IList<T>?
[英]Why doesn't IEnumerable of anonymous types return a List<object> on ToList()?
这是我想要创建的简化函数:
static List<object> GetAnonList(IEnumerable<string> names)
{
return names.Select(name => new { FirstName = name }).ToList();
}
在该代码块中,我得到编译器错误:
错误CS0029无法将类型'System.Collections.Generic.List <>'隐式转换为'System.Collections.Generic.List'
在匿名类型的文档中,它表示匿名类型被视为类型对象。 为什么C#编译器没有在names.ToList()
上返回List<object>
?
此外,为什么以下代码不会导致错误? 如果List<<anonymous type: string FirstName>>
无法转换为List<object>
,那么为什么它可以转换为IEnumberable<object>
?
static IEnumerable<object> GetAnonList(IEnumerable<string> names)
{
return names.Select(name => new { FirstName = name }).ToList();
}
如果
List<<anonymous type: string FirstName>>
无法转换为List<object>
,那么为什么它可以转换为IEnumberable<object>
?
那是因为IEnumerable<T>
是协变的而List<T>
不是。 它与匿名类型无关。
如果你编写的代码是工作的,你可以使用List<string>
作为List<object>
并添加任何东西来打破类型安全。
您可以通过将泛型类型参数传递给ToList
调用来使代码工作:
static List<object> GetAnonList(IEnumerable<string> names)
{
return names.Select(name => new { FirstName = name }).ToList<object>();
}
但是除了这种方法之外,你几乎无法做到这一点。 除非使用反射,否则您将无法访问FirstName
属性。
IEnumerable<out T>
IEnumerable(T)Document
List<T>
列表(T)文档
请注意,IEnumerable接口上有“out”Generic Modifier,它允许您将更多派生类型放入IEnumerable。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.