类型参数无法从高阶函数的用法中推断出来

本文关键字:用法 推断出 函数 高阶 类型参数 | 更新日期: 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);

虽然,似乎编译器应该有足够的信息来推断这里的类型参数 - 这不应该是必需的......