我有一个名为 Grouping 的抽象类。我有一个名为 GroupingNNA 的子类。public class GroupingNNA : Grouping { // blah blah blah}我有一个包含 GroupingNNA 类型的项目的列表,但实际上声明为包含 Grouping 类型的项目。List<Grouping> lstGroupings = new List<Grouping>();lstGroupings.Add( new GroupingNNA { fName = "Joe" });lstGroupings.Add( new GroupingNNA { fName = "Jane" }); 问题:由于 lstGroupings 被声明为 List 并且 fName 是 GroupingNNA 的一个属性,而不是 Grouping,因此下面的 LINQ 查询让我大吃一惊。var results = from g in lstGroupings where r.fName == "Jane" select r;哦,这是编译器错误,而不是运行时错误。在此先感谢您对这方面的任何帮助! 更多信息:这是无法编译的实际方法。 OfType() 修复了 LINQ 查询,但编译器不喜欢我试图将匿名类型作为 List 返回的事实。private List<Grouping> ApplyFilterSens(List<Grouping> lstGroupings, string fSens) { // This works now! Thanks @Lasse var filtered = from r in lstGroupings.OfType<GroupingNNA>() where r.QASensitivity == fSens select r; if (filtered != null) { **// Compiler doesn't like this now** return filtered.ToList<Grouping>(); } else return new List<Grouping>(); } (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 尝试:= from g in lstGroupings.OfType<GroupingNNA>()这将跳过任何不是 GroupingNNA 类型的元素,并使编译器使用 GroupingNNA 作为 g 的类型。回应评论和编辑的问题。不,编译器肯定不会对您更改的集合感到满意,但您可以解决这个问题:return new List<Grouping>(filtered.ToArray());这依赖于 .NET 中的数组是协变/逆变这一事实,这允许编译器将 GroupingNNA[] 视为构造函数的 Grouping[]。此外,您不需要 if (filtered != null) 检查,您将在 filtered 中获得一个集合,它可能不会产生任何元素,但 filtered 将始终是非 null 。这意味着你的代码可以写成:var filtered = from r in lstGroupings.OfType<GroupingNNA>() where r.QASensitivity == fSens select r;return new List<Grouping>(filtered.ToArray());甚至只是:return new List<Grouping>((from r in lstGroupings.OfType<GroupingNNA>() where r.QASensitivity == fSens select r).ToArray());如果您删除 linq 语法,甚至更短:return new List<Grouping>((lstGroupings.OfType<GroupingNNA>() .Where(r => r.QASensitivity == fSens).ToArray());请注意,您当然也可以使用 OfType 来反其道而行之:return filtered.OfType<Grouping>().ToList();这里的不同方式之间不应该有任何大的性能差异,如果有疑问,请对其进行测量,但我会采用您认为最容易阅读和理解的方法。 (adsbygoogle = window.adsbygoogle || []).push({});
10-05 22:47