c# - 尝试将 List<T> 分配给 List<U> 时出现无法转换错误,其中 U 是 T 的接口(interface)

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

编译器会抛出一个错误,基本上说无法转换 ObjectAIObjectA

为了让它工作,我必须添加

IList<IObjectA> list = someList.Select(c => new ObjectA(c.Id, c.Name)).Cast<IObjectA>().ToList();

有人可以解释一下为什么编译会提示吗? 提前致谢!

最佳答案

问题在于 linq 表达式会产生 List<ObjectA> 。如果你可以将此结果视为 List<IObjectA> ,编译器可能会让您添加假设的 OtherObjectA对象到列表中,如果您尝试恢复到原始 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>进一步获取代码。

关于c# - 尝试将 List<T> 分配给 List<U> 时出现无法转换错误,其中 U 是 T 的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37439793/

相关文章:

c# - 我应该如何构建我的领域模型

c# - LINQ 读取 XML ...与 XDocument

c# - 具有不同键和选定值的字典对象列表

c# - 优化查找所有实现 IInterface<T> 的类以及使用特定类型显式实现它的类

c# - 使用 Linq 更新集合中除一个对象之外的所有对象

c# - 如何显示哪个子正则表达式匹配失败?

C#项目加载不同版本的系统程序集

c# - Excel加载项密码文本框

c# - ASP.net应用程序是否需要上传.cs和.designer.cs文件

c# - 搜索查询给出 LINQ to SQL 异常