Подтвердить что ты не робот

Аргументы типа не могут быть выведены из использования для функции более высокого порядка

У меня есть следующая функция более высокого порядка:

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

Ответ 1

Подробности вопроса, о котором вы говорите, отвечает Эрик Липперт в своем блоге здесь.

В принципе, как сказал Дэвид Б в ваших комментариях, "IsNullOrWhiteSpace - это группа методов. В группе методов только один участник-участник сегодня, но он может получить больше в будущем".

Ответ 2

Это работает:

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

Хотя, похоже, что компилятор должен иметь достаточную информацию для вывода здесь параметров типа - и это не требуется...