这里是代码说明
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();
有人可以解释一下为什么编译会提示吗? 提前致谢!
最佳答案
问题在于 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/