gpt4 book ai didi

c# Linq `List.AddRange` 方法不工作

转载 作者:太空狗 更新时间:2023-10-29 19:59:05 26 4
gpt4 key购买 nike

我有一个定义如下的接口(interface):

public interface TestInterface{
int id { get; set; }
}

还有两个实现该接口(interface)的 Linq-to-SQL 类:

public class tblTestA : TestInterface{
public int id { get; set; }
}

public class tblTestB : TestInterface{
public int id { get; set; }
}

我有 IEnumerable 列表 a 和 b,由来自 tblTestA 和 tblTestB 的数据库记录填充

IEnumerable<tblTestA> a = db.tblTestAs.AsEnumerable();
IEnumerable<tblTestB> b = db.tblTestBs.AsEnumerable();

但是,以下内容是不允许的:

List<TestInterface> list = new List<TestInterface>();
list.AddRange(a);
list.AddRange(b);

我必须做如下:

foreach(tblTestA item in a)
list.Add(item)

foreach(tblTestB item in b)
list.Add(item)

我做错了什么吗?感谢您的帮助

最佳答案

由于通用协方差,这在 C# 4 中有效。与以前版本的 C# 不同,有一个从 IEnumerable<tblTestA> 的转换。至 IEnumerable<TestInterface> .

该功能已包含在 v2 的 CLR 中,但仅在 C# 4 中公开(框架类型在 .NET 4 之前也未利用它)。它适用于通用接口(interface)和委托(delegate)(不是类)并且仅适用于引用类型(例如,因此没有从 IEnumerable<int>IEnumerable<object> 的转换。)它也只在有意义的地方工作 - IEnumerable<T>是协变的,因为对象只从 API“出来”,而 IList<T>不变的,因为您也可以使用该 API 添加值。

还支持通用逆变,在另一个方向上工作 - 例如,您可以从 IComparer<object> 转换至 IComparer<string> .

如果您不使用 C# 4,那么 Tim 建议使用 Enumerable.Cast<T>是一个很好的 - 你会失去一点效率,但它会起作用。

如果您想了解有关泛型方差的更多信息,Eric Lippert 有一个 long series of blog posts about it ,我在 NDC 2010 上做了一个演讲,你可以在 NDC video page 上观看.

关于c# Linq `List<Interface>.AddRange` 方法不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3244945/

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