gpt4 book ai didi

c# - 无法在泛型委托(delegate)中推断出类型

转载 作者:行者123 更新时间:2023-12-05 04:10:21 24 4
gpt4 key购买 nike

this answer ,我写了一个 LINQ 扩展,它利用以下 delegate , 所以我可以传入一个带有 out 的函数变量,例如 int.TryParse :

public delegate bool TryFunc<TSource, TResult>(TSource source, out TResult result);

public static IEnumerable<TResult> SelectTry<TSource, TResult>(
this IEnumerable<TSource> source, TryFunc<TSource, TResult> selector)
{
foreach (TSource item in source)
{
TResult result;
if (selector(item, out result))
{
yield return result;
}
}
}

为了使用这个扩展,我必须明确指定 <string, int>像这样的类型:

"1,2,3,4,s,6".Split(',').SelectTry<string, int>(int.TryParse); // [1,2,3,4,6]

我想删除 <string, int> ,类似于我们如何调用 .Select(int.Parse)未指定 <int> ,但是当我这样做时,出现以下错误:

The type arguments for method 'LINQExtensions.SelectTry(IEnumerable, LINQExtensions.TryFunc)' cannot be inferred from the usage. Try specifying the type arguments explicitly.


我的问题是,为什么不能推断类型?我的理解是编译器应该知道 int.TryParse 的签名随后是 TryFunc delegate在编译时。

最佳答案

无法推断,因为只有一个参数适合,那就是字符串。第二个参数是 out int 并且不能在通用参数中指定,这就是为什么它说不能推断参数。

在不指定参数的情况下调用 SelectTry 的唯一方法是在指向 int.TryParse 的某处声明您的委托(delegate),然后将其作为参数传递。

我知道这不是您想要的,这是我所知道的绕过指定参数的唯一方法。

TryFunc<string, int> foo = int.TryParse;
var s = "1,2,3,4,s,6".Split(',').SelectTry(foo);

请记住,为了将方法作为委托(delegate)传递,参数必须 1:1 匹配。 int.TryParse 匹配TryFunc,但不匹配SelectTry

关于c# - 无法在泛型委托(delegate)中推断出类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44687101/

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