这里是代码插图
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();
有人可以解释为什么编译会抱怨吗? 提前谢谢!
答案 0 :(得分:3)
问题是linq表达式导致List<ObjectA>
。如果您可以将此结果视为List<IObjectA>
,编译器可能会允许您将假设的OtherObjectA
对象添加到列表中,如果您尝试转换回原始{{1类型,应该被允许。
要解决此问题,您可以在调用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>
代码才能继续使用。