Аргументы типа не могут быть выведены из использования для функции более высокого порядка
У меня есть следующая функция более высокого порядка:
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);
Ответы
Ответ 1
Подробности вопроса, о котором вы говорите, отвечает Эрик Липперт в своем блоге здесь.
В принципе, как сказал Дэвид Б в ваших комментариях, "IsNullOrWhiteSpace - это группа методов. В группе методов только один участник-участник сегодня, но он может получить больше в будущем".
Ответ 2
Это работает:
var isValidStr = Not<string>(string.IsNullOrWhiteSpace);
Хотя, похоже, что компилятор должен иметь достаточную информацию для вывода здесь параметров типа - и это не требуется...