In C# all delegate types are incompatible with one another, even if they have the same signature. What is the reasoning behind this behaviour and language design decision?
Во-первых, я думаю, что это справедливо сказать, что многие из среды выполнения и разработчиков языка сожалеть об этом решении. Структурная типизация делегатов, то есть сопоставление по сигнатуре, является часто запрашиваемой функцией, и кажется странным, что Func<int, bool>
и Predicate<int>
не могут быть свободно назначены друг другу.
Причина, по которой я принимаю решение, и я спешу добавить, что это решение было принято около шести лет, прежде чем я начал работу с командой C#, - это то, что ожидалось, что будут типы делегатов с семантика. Вы хотите, чтобы это было ошибка типа:
AnyFunction<int, int> af = x=> { Console.WriteLine(x); return x + y; };
PureFunction<int, int> pf = af;
«чистая» функция А является функцией, которая производит и потребляет никаких побочных эффектов, не потребляет никакой информации за пределами своих аргументов, и возвращает последовательное значение, когда одни и те же аргументы , Очевидно, что af
имеет не менее двух из них и поэтому не должен быть назначен pf
как неявное преобразование.
Но семантически загруженные делегатские типы никогда не происходили, поэтому сейчас это немного неправильно.
Я не могу дать вам аргументы, но делегаты были оригинальной особенностью языка. С тех пор они добавили лямбда-методы, [Действия] (http://msdn.microsoft.com/en-us/library/system.action.aspx) и [Funcs] (http://msdn.microsoft.com/ en-us/library/bb534960.aspx), которые не страдают от одной и той же проблемы. – Brandon
@Brandon Что? Lambdas преобразуются в делегаты (или деревья выражений), а 'Action' и 'Func' * являются * просто делегированными типами, поэтому они соответствуют точно таким же правилам. – svick
Проверки делегатов также проверяются во время выполнения. Это было оптимизировано, важный вид оптимизации, поддерживается только строгий тип. Это быстро. –