Возможно, я немного опаздываю и немного не по теме, но здесь все равно ...
Вам не нужно выбирать из-за содержимого вашей строки между: alert("It's \"game\" time.");
или alert('It\'s "game" time.');
Вместо этого вы можете ввести так, а затем использовать либо двойные, либо одинарные кавычки, потому что это не имеет значения: alert("It’s “game” time.");
и alert('It’s “game” time.');
Довольно запоздалый, но случайно я наткнулся на один и тот же вопрос, и точный ответ можно найти здесь: важный комментарий
В основном это означает, что это несогласованность, основанная на неудачной решение реализовать его таким образом. Пока predicate<T> == func<T, bool>
, они разные, несмотря на одну и ту же подпись. Я полагаю, что по соображениям обратной совместимости можно преобразовать выражение и / или лямбда, а затем вернуть предикат через new predicate<T>(func<T, bool>)
.
Типы делегатов не являются неявно конвертируемыми, даже если они имеют все те же параметры и возвращаемую информацию. Тем не менее, есть простой способ обхода вашего дела. Вы можете использовать метод .Invoke
для вашего экземпляра делегата.
public static T FirstEffective<T>(IEnumerable<T> list)
{
Predicate<T> pred = x => x != null;
return Enumerable.FirstOrDefault(list, pred.Invoke);
}
Что касается вопроса о том, почему делегаты работают таким образом, то ответ заключается в том, что это было дизайнерское решение. Классы, имеющие одинаковые общедоступные интерфейсы, также неявно конвертируемы, поэтому это не совсем противоречиво.