当前位置: 首页 > 编程语言 > C#

List.AddRange(List)doesn'twork分享

时间:2023-04-11 01:51:17 C#

List.AddRange(List)doesn'twork我发现无法将具体对象列表添加到界面对象列表中。publicstaticvoidAddJob(ListmasterJobs,Listjobs){masterJobs.AddRange(jobs);//编译失败}相反,使用以下代码:publicstaticvoidAddJob(ListmasterJobs,Listjobs){masterJobs.AddRange(jobs.Cast());这背后的基本原理是什么?Lasse关于为什么这在C#3中不起作用的原因是正确的——没有要列出的列表。在C#4中,它起作用不是因为列表是协变的,而是因为IEnumerable是协变的。换句话说,代码实际上是:publicstaticvoidAddJob(ListmasterJobs,Listjobs){IEnumerablejobsTmp=jobs;//这是协方差工作masterJobs.AddRange(jobs);//现在可以了}作业实现了IEnumerable,因此通过协方差对IEnumerable进行了引用转换,因此一切正常。对Cast的调用实际上在C#3解决方法中做了类似的工作——您正在使用它来转换为IEnumerable。如果您想详细了解泛型的差异,可以观看我的NDC2010演讲视频,或阅读EricLippert的一系列博客文章。原因是即使Job实现了IJob,List也不是List。这是一个常见的或反对的变化(我永远不记得哪个是哪个。)这个想法是这样的:编译器不能保证AddRange只会从给定的参数中读取,所以不能保证这是安全的,所以它不会编译。例如,所有编译器都知道,AddRange可以向jobs参数添加另一个对象,该对象实现IJob(因为AddRange需要IJob集合),但不是Job,而Job是jobs所期望的,因此它是不安全的。在C#4.0中,有一些支持来处理这个问题,但我不确定它是否会处理您的特定情况,因为必须在接口级别而不是方法级别指定支持。换句话说,你必须在接口类型上指定所有与T相关的东西只进入集合,永远不会出来,然后编译器会让你去做。但是,你看不懂的收藏就没有意义了。以上就是C#学习教程的全部内容:List.AddRange(List)不起作用。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: