gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:48:47 25 4
gpt4 key购买 nike

这里是代码说明

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com