在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
的簽名。
是否https://stackoverflow.com/questions/19015283/why-cant-c-sharp-compiler-infer-generic-type-delegate-from-function-signature幫助? – mjwills