C # - Почему не Predicate & lt; T & gt; лить в / из с помощью Func & lt; T, bool & gt; [Дубликат]

Возможно, я немного опаздываю и немного не по теме, но здесь все равно ...

Вам не нужно выбирать из-за содержимого вашей строки между: alert("It's \"game\" time."); или alert('It\'s "game" time.');

Вместо этого вы можете ввести так, а затем использовать либо двойные, либо одинарные кавычки, потому что это не имеет значения: alert("It’s “game” time."); и alert('It’s “game” time.');

13
задан Willem Van Onsem 25 August 2014 в 18:30
поделиться

2 ответа

Довольно запоздалый, но случайно я наткнулся на один и тот же вопрос, и точный ответ можно найти здесь: важный комментарий

В основном это означает, что это несогласованность, основанная на неудачной решение реализовать его таким образом. Пока predicate<T> == func<T, bool>, они разные, несмотря на одну и ту же подпись. Я полагаю, что по соображениям обратной совместимости можно преобразовать выражение и / или лямбда, а затем вернуть предикат через new predicate<T>(func<T, bool>).

1
ответ дан Community 31 August 2018 в 15:57
поделиться

Типы делегатов не являются неявно конвертируемыми, даже если они имеют все те же параметры и возвращаемую информацию. Тем не менее, есть простой способ обхода вашего дела. Вы можете использовать метод .Invoke для вашего экземпляра делегата.

public static T FirstEffective<T>(IEnumerable<T> list)
{
    Predicate<T> pred = x => x != null;
    return Enumerable.FirstOrDefault(list, pred.Invoke);
}

Что касается вопроса о том, почему делегаты работают таким образом, то ответ заключается в том, что это было дизайнерское решение. Классы, имеющие одинаковые общедоступные интерфейсы, также неявно конвертируемы, поэтому это не совсем противоречиво.

4
ответ дан Willem Van Onsem 31 August 2018 в 15:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: