Lambdas超过多态类

ove*_*ked 3 c# linq lambda

在下面的代码中,请注意Bar来自Foo.

class Program
{
    public class Foo
    {
        public string data { get; set; }
    }

    public class Bar : Foo
    {
    }

    static void Main(string[] args)
    {
        var bars = new List<Bar>();

        bars.Add(new Bar() { data = "hello" });
        bars.Add(new Bar() { data = "world" });

        var resultsA = GetFoos(bars, (b => b.data.StartsWith("h")));
        var resultsB = GetBars(bars, (b => b.data.StartsWith("h")));
    }

    static List<Foo> GetFoos(List<Foo> fooList, Func<Foo, bool> criteria)
    {
        return fooList.Where(criteria).ToList();
    }

    static List<Bar> GetBars(List<Bar> barList, Func<Bar, bool> criteria)
    {
        return barList.Where(criteria).ToList();
    }
}
Run Code Online (Sandbox Code Playgroud)

GetFoos方法调用导致此编译器错误消息:参数1:无法从' System.Collections.Generic.List<Program.Bar>' 转换为' System.Collections.Generic.List<Program.Foo>'

但是,当该行被注释掉时,对GetBars()的调用将正确执行.

我正在尝试在这里完成,对一个共同的祖先类的查询,可能与linq?

Bra*_*NET 6

只有接口才能协变.由于您尝试将a分配List<Derived>给a List<Base>,因此需要使用协变接口.IEnumerable已经是协变的,所以只需将代码更改为:

static List<Foo> GetFoos(IEnumerable<Foo> fooList, Func<Foo, bool> criteria)
{
    return fooList.Where(criteria).ToList();
}

static List<Bar> GetBars(IEnumerable<Bar> barList, Func<Bar, bool> criteria)
{
    return barList.Where(criteria).ToList();
}
Run Code Online (Sandbox Code Playgroud)

IdeOne的证明