尝试将List <t>分配给List <u>时,无法转换错误,其中U是T的接口

时间:2016-05-25 14:13:16

标签: c# linq

这里是代码插图

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();

有人可以解释为什么编译会抱怨吗? 提前谢谢!

1 个答案:

答案 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>代码才能继续使用。