Ответ 1
В С# все типы делегатов несовместимы друг с другом, даже если они имеют одну и ту же подпись. В чем причина такого поведения и решения по языковому дизайну?
Во-первых, я считаю, что справедливо сказать, что многие разработчики времени и языка сожалеют об этом решении. Структурная типизация на делегатах, то есть сопоставление по сигнатуре, является часто запрашиваемой функцией, и кажется странным, что Func<int, bool>
и Predicate<int>
не могут быть свободно назначены друг другу.
Обоснование решения, насколько я понимаю, - и я спешу добавить, что это решение было принято около шести лет, прежде чем я начал работу с командой С#, - это то, что ожидалось, что будут типы делегатов с семантикой. Вы хотите, чтобы это была ошибка типа:
AnyFunction<int, int> af = x=> { Console.WriteLine(x); return x + y; };
PureFunction<int, int> pf = af;
"Чистая" функция - это функция, которая производит и не потребляет побочных эффектов, не потребляет никакой информации за пределами своих аргументов и возвращает согласованное значение при предоставлении тех же аргументов. Понятно, что af
выдает не менее двух из них и поэтому не следует присваивать pf
как неявное преобразование.
Но семантически загруженные типы делегатов никогда не происходили, так что теперь это немного неправильно.