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?
Po pierwsze, myślę, że to sprawiedliwe, by powiedzieć, że wielu projektantów uruchomieniowych i językowych żałować tej decyzji. Pisanie strukturalne na delegatach - czyli dopasowywanie przez podpis - jest często żądaną funkcją i wydaje się dziwne, że Func<int, bool>
i Predicate<int>
nie mogą być swobodnie przypisywane sobie nawzajem.
Rozumowanie decyzji, tak jak ją rozumiem - i spieszę dodać, że decyzja ta została podjęta około sześć lat przed rozpoczęciem pracy w zespole C# - jest to, że oczekiwano, że będą delegowane typy z semantyka. Chcesz to być błąd typ:
AnyFunction<int, int> af = x=> { Console.WriteLine(x); return x + y; };
PureFunction<int, int> pf = af;
funkcja A „czysta” jest funkcją, która produkuje i konsumuje żadnych skutków ubocznych, zużywa żadnej informacji poza jego argumenty i zwraca stałą wartość, gdy biorąc pod uwagę te same argumenty . Najwyraźniej af
zawodzi co najmniej dwa z nich, a więc nie należy go przypisywać do pf
jako niejawnej konwersji.
Ale typy delegatów z semantyką nigdy się nie zdarzały, więc teraz jest to trochę nieporozumienie.
Nie mogę podać ci uzasadnienia, ale delegaci byli oryginalną funkcją językową. Od tego czasu dodali metody lambda: [Actions] (http://msdn.microsoft.com/en-us/library/system.action.aspx) i [Funcs] (http://msdn.microsoft.com/ en-us/library/bb534960.aspx), które nie cierpią z powodu tego samego problemu. – Brandon
@brandon Co? Lambdas są konwertowane na delegatów (lub drzewek wyrażeń), a 'Action's i' Func's * to * tylko typy delegatów, więc stosują dokładnie te same reguły. – svick
Delegowane wywołania są również sprawdzane w czasie wykonywania. To było zoptymalizowane, ważny rodzaj optymalizacji, obsługiwana jest tylko ścisła tożsamość typu. To szybko. –