繁体   English   中英

尝试分配列表时无法转换错误 <T> 列出<U>U是T的接口</u>

[英]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();

编译器将引发我一个错误基本上是说不能转换ObjectAIObjectA

为了使其工作,我必须添加

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM