gpt4 book ai didi

c# - 当泛型不匹配时,为什么泛型方法不能选择特定方法?

转载 作者:行者123 更新时间:2023-11-30 15:18:20 27 4
gpt4 key购买 nike

给定以下类:

public static class MWE
{
public static void Foo<T, TColl>(Expression<Func<IFoo, bool>> bar, TColl foos)
where TColl : IEnumerable<T>
{
}

public static void Foo<T, TColl>(Expression<Func<IFoo, T>> bar, TColl foos)
where TColl : IEnumerable<T>
{
}

static MWE()
{
Foo(bar => bar.GetThing(), new List<IThing>());
Foo(bar => bar.GetBool(), new List<IThing>());
}
}

public interface IFoo
{
IThing GetThing();

bool GetBool();
}

第二次调用 Foo 时出现编译错误,提示没有来自 List<IThing> 的转换至 IEnumerable<bool> .在我看来,编译器没有看到第一个重载,尽管它匹配(而第二个没有)。

为什么?这两种方法是否可以共存并起作用?

最佳答案

无法调用第一个重载,因为没有足够的信息来推断通用参数。您使用一个通用参数,TColl , 但你从不使用 T在签名中,因此无法推断。

如果您显式指定泛型参数,则会选择第一个重载并正常工作。

如果您只是完全删除第二个通用参数,并使用 IEnumerable<T>在签名中而不是 TColl它将简化这些方法并允许您现有的两个调用正常运行。

关于c# - 当泛型不匹配时,为什么泛型方法不能选择特定方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44115621/

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