gpt4 book ai didi

c# - 多态类上的 Lambda

转载 作者:行者123 更新时间:2023-11-30 13:36:51 25 4
gpt4 key购买 nike

在下面的代码中,请注意 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();
}
}

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

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

我在这里尝试完成的是针对共同祖先类的查询,是否可以使用 linq?

最佳答案

只有接口(interface)可以是covariant .由于您正在尝试分配 List<Derived>List<Base> ,您需要改用协变接口(interface)。 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();
}

关于 IdeOne 的证明

关于c# - 多态类上的 Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28953103/

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