当S和T不同时,这样做:
public static void Fun<S,T>(Func<S,T> func) { } Fun((string s) => true); //compiles,T is inferred from return type.
但,
public static void Fun<T>(Func<T,T> func) { } Fun(t => true); //can't infer type.
在第一个例子中,由于T是从lambda表达式的返回类型推断的,所以在第二个例子中也不能推断T?我想它的做法,但是为什么第一个T不知道,当第二个T的Func< T,T>知道了,毕竟T == T对吧?还是在Funcs的情况下推断类型的订单?
解决方法
它与S和T没有什么不同.它与您在第一种情况下提供正式参数类型相关,而在第二种情况下不提供它.
方法类型推断不会尝试从lambda中推断代理的返回类型,直到委托的形式参数类型已知为止.
在第二种情况下,您已经给编译器没有提供正式参数类型T,因此,lambda的主体甚至不会被分析.
What do you mean by “formal parameter type”?
形式参数是一个变量,它接受传递给方法,索引器,构造函数,lambda或匿名方法的参数的值. (或者,在out和ref格式参数的情况下,变为调用者提供的变量的别名.)正式参数是变量,因此具有类型.
委托代表R Func< A,R>(A a);具有类型A的形式参数a.使用方法类型参数来构造,以使得Func
一个例子中,你有一个lambda类型的形式参数的lambda.因此,因为这个lambda参数与方法fun的形式参数func相对应,因此func的形式参数类型是func="" 一个罕见的情况,类型推理算法没有被写入以利用它.="" 如果这是您想要的类型推断,请考虑使用f#而不是c#.它具有更先进的类型推理算法,基于hindley-milner算法.
,所以委托的形式参数类型现在为s.类型推断的任务是推断出这些类型s和t.>
相关文章
- c# - 为什么要使用Expression
>而不是Func - &t表达式(&t)T(t)在c中的含义是什么?
- c# - Func <>与delegate和lambda表达式的区别
- .net - 为什么Func和Expression之间的lambda表达式参数不明确?
- Scala类型扩展/推断foo [T](T,T):T
- 检查数组S和T中是否为整数s和t的算法,则s t = k
- 为什么我不能在Java 8 lambda表达式中抛出异常?
- 为什么Rust不能在简单的闭包中推断出适当的生命周期,或者推断出它们是冲突的?
点击查看更多相关文章
转载注明原文:仅当S和T不同时,才能从lambda表达式的输出推断出Func的T? - 代码日志