无法在通用委托中推断类型

时间:2017-06-21 22:13:57

标签: c# linq delegates

this answer中,我编写了一个使用以下lista=lista[lista['Estado:'].isin('RJ' , 'SP' , 'PR' , 'RS')] print (lista) 的LINQ扩展,因此我可以使用delegate变量传递函数,例如out:< / p>

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),但是当我这样做时,我收到以下错误:

  

方法的类型参数&#39; LINQExtensions.SelectTry(IEnumerable,LINQExtensions.TryFunc)&#39;无法从使用中推断出来。尝试明确指定类型参数。

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

1 个答案:

答案 0 :(得分:2)

无法推断,因为只有其中一个参数适合并且是字符串。第二个参数是out int,并且不能在泛型参数中指定,这就是它无法推断出参数的原因。

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

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

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

请记住,为了将方法作为委托传递,参数必须与1:1匹配。 int.TryParseTryFunc匹配,但与SelectTry

不匹配