我想知道不允许这种转换的原因。这个主题已经在post in SO中找到了,但是我想要低级解释为什么这不可能是原生的。
为什么这些演员会失败?
OBS:我知道通过反思可以做到这一点。
IList<People> peopleList = new List<People>()
{
new People() { Name = "Again", Age = 10 },
new People() { Name = "Over", Age = 20 },
new People() { Name = "Jonh", Age = 30 },
new People() { Name = "Enzo", Age = 40 },
};
var anonymous = (from p in peopleList
select new
{
Name = p.Name,
Age = p.Age
});
// Does not work
IList<People> listt = (IList<People>)anonymous;
//Does not Work
IList<People> listt = (anonymous as List<People>);
答案 0 :(得分:6)
问题是为什么anonymous
无法成功投放到IList<People>
或List<People>
。
anonymous
实现了IEnumerable<T>
,而不是IList<T>
,当然它不是List<T>
子类型。因此,它无法转换为任何IList<T>
或List<T>
类型。如果这是你想要的,那么使用ToList()
来执行查询并将结果集存储在列表中。IEnumerable<People>
吗?不是。这是一系列匿名类型的对象,它们复制了与People
相关的一些值。所以它是一系列匿名对象,而不是一系列人。 我还注意到,在新的C#7代码中,如果可以在应用程序中使用元组而不是匿名类型,这是更好的做法。他们在型式系统中有更好的支持,产生的收集压力更小。