10

我有以下高阶函数:

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

2 回答 2

6

Eric Lippert 在他的博客上回答了您正在处理的问题的详细信息,请点击此处

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

于 2012-06-12T17:37:59.087 回答
2

这有效:

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

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

于 2012-06-12T17:26:35.570 回答