我有以下方法:
public static void Foo<T>(Predicate<T> validator) { ... }
我想用以下方式来称呼它:
Foo(s => string.IsNullOrEmpty(s));
为什么编译器确定s
为string
,因此T
为string
?规范中的哪条规则会使推理算法失败?
答案 0 :(得分:1)
我承认我还没有检查过整个C#5.0规范,但 8.5.1局部变量声明部分讨论了var
关键字,用于声明推断类型。
以下是为var
和所有推断变量声明的变量的规则:
因为这是一个lambda,你推断的初始化器是:
string.IsNullOrEmpty(s)
好的,所以...
因此,要回答您的问题,您的初始化程序最终会失败,因为在将其传递给方法之前必须知道其类型。
Lambda可以相对容易地解决这个问题,但是:
Foo(string s => string.IsNullOrEmpty(s));