- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在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/
我是一名优秀的程序员,十分优秀!