我有以下高阶函数:
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);
答案 0 :(得分:6)
Eric Lippert在他的博客here上回答了您正在处理的问题的详细信息。
基本上,正如“David B”在你的评论中所说,“IsNullOrWhiteSpace是一个方法组。方法组今天只有一个参与成员,但将来可能会有更多。”
答案 1 :(得分:2)
这有效:
var isValidStr = Not<string>(string.IsNullOrWhiteSpace);
虽然,编译器似乎应该有足够的信息来推断类型参数 - 这不应该是必需的......