[英]cannot convert error when trying to assign List<T> to List<U> where U is T's interface
这是代码图
interface IObjectA
{
int Id { get; }
string Name { get; }
}
class ObjectA : IObjectA
{
public int Id { get; set; }
public string Name { get; set; }
public ObjectA(int id, string name)
{
Id = id;
Name = name;
}
}
我有两种方法可以从其他一些对象生成List<IObjectA>
第一个是使用forloop:
IList<IObjectA> list = new List<IObjectA>();
foreach(var item in someList)
{
list.Add(new ObjectA(item.Id, item.Name));
}
这工作得很好。 然后我尝试了linq
IList<IObjectA> list = someList.Select(c => new ObjectA(c.Id, c.Name)).ToList();
编译器将引发我一个错误基本上是说不能转换ObjectA
以IObjectA
为了使其工作,我必须添加
IList<IObjectA> list = someList.Select(c => new ObjectA(c.Id, c.Name)).Cast<IObjectA>().ToList();
有人可以解释为什么编译会抱怨吗? 提前致谢!
问题是linq表达式导致List<ObjectA>
。 如果您可以将此结果视为List<IObjectA>
,则编译器可能会允许您向列表中添加假设的OtherObjectA
对象,如果您尝试回退到原始List<ObjectA>
类型,该List<ObjectA>
将被炸掉。被)允许。
为了解决这个问题,你可以.Cast()
调用之前的元素.ToList()
以获得正确类型的列表:
IList<IObjectA> list = someList.Select(c => new ObjectA(c.Id, c.Name)).Cast<IObjectA>().ToList();
您还可以使用var
关键字:
var list = someList.Select(c => new ObjectA(c.Id, c.Name)).ToList();
但是,这仍然会导致List<ObjectA>
我怀疑你需要的List<IObjectA>
代码进一步上。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.