gpt4 book ai didi

c# - List.AddRange(List) 不起作用

转载 作者:太空狗 更新时间:2023-10-29 22:08:44 25 4
gpt4 key购买 nike

我发现不能将具体对象列表添加到接口(interface)对象列表中。

public static void AddJob(List<IJob> masterJobs, List<Job> jobs)
{
masterJobs.AddRange(jobs); //fail to compile
}

相反,需要使用以下代码:

public static void AddJob(List<IJob> masterJobs, List<Job> jobs)
{
masterJobs.AddRange(jobs.Cast<IJob>());
}

这背后的道理是什么?

最佳答案

Lasse 关于为什么这在 C# 3 中不起作用的说法是正确的——没有从 List<IJob> 的转换至 List<Job> .

在 C# 4 中它会工作,不是因为 list 是协变的,而是因为 IEnumerable<T>是协变的。所以换句话说,代码实际上是:

public static void AddJob(List<IJob> masterJobs, List<Job> jobs)
{
IEnumerable<IJob> jobsTmp = jobs; // This is the covariance working
masterJobs.AddRange(jobs); // This is now fine
}

jobs工具 IEnumerable<Job> , 所以有一个引用转换为 IEnumerable<IJob>通过协方差,所以一切正常。调用Cast<T>在您的 C# 3 解决方法中有效地做了类似的工作 - 您正在使用它转换为 IEnumerable<IJob> .

如果您想了解更多关于通用方差的信息,可以使用 video of my NDC 2010 talk可用,或阅读 Eric Lippert 的 series of blog posts在上面。

关于c# - List<IJob>.AddRange(List<Job>) 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3343246/

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