类型参数无法从高阶函数的用法中推断出来
本文关键字:用法 推断出 函数 高阶 类型参数 | 更新日期: 2023-09-27 18:36:53
我有以下高阶函数:
public static Func<T, bool> Not<T>(Func<T, bool> otherFunc)
{
return arg => !otherFunc(arg);
}
并尝试这样称呼它:
var isValidStr = LinqUtils.Not(string.IsNullOrWhiteSpace);
编译器给了我"无法从用法中推断出类型参数"错误。但以下工作:
var isValidStr = LinqUtils.Not((string s) => string.IsNullOrWhiteSpace(s));
我想知道有什么区别? string.IsNullOrWhiteSpace
已经是一个具有完全相同签名的非重载函数。
如注释中所述,以下内容也有效,但仍然无法解释为什么在这种情况下类型推断失败:
var isValidStr = LinqUtils.Not<string>(string.IsNullOrWhiteSpace);
您正在处理的问题的细节由Eric Lippert在他的博客上回答,这里。
基本上,正如"David B"在您的评论中所说,"IsNullOrWhiteSpace是一个方法组。方法组目前只有一个参与成员,但将来可能会有更多参与。
这有效:
var isValidStr = Not<string>(string.IsNullOrWhiteSpace);
虽然,似乎编译器应该有足够的信息来推断这里的类型参数 - 这不应该是必需的......