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

时间:2012-06-12 17:24:04

标签: c# delegates functional-programming higher-order-functions anonymous-delegates

我有以下高阶函数:

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);

2 个答案:

答案 0 :(得分:6)

Eric Lippert在他的博客here上回答了您正在处理的问题的详细信息。

基本上,正如“David B”在你的评论中所说,“IsNullOrWhiteSpace是一个方法组。方法组今天只有一个参与成员,但将来可能会有更多。”

答案 1 :(得分:2)

这有效:

var isValidStr = Not<string>(string.IsNullOrWhiteSpace);

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