【发布时间】:2017-06-22 06:58:20
【问题描述】:
在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>,类似于我们可以在不指定<int> 的情况下调用.Select(int.Parse),但是当我这样做时,我收到以下错误:
无法从用法推断方法“LINQExtensions.SelectTry(IEnumerable, LINQExtensions.TryFunc)”的类型参数。尝试明确指定类型参数。
我的问题是,为什么不能推断类型?我的理解是编译器应该知道 int.TryParse 的签名,然后是 TryFunc delegate 在编译时。
【问题讨论】: