moją chorobliwą ciekawość ma mnie zastanawiać, dlaczego po nie:Nie można przypisać delegata jednego typu na inny, mimo że podpis pasuje
// declared somewhere
public delegate int BinaryOperation(int a, int b);
// ... in a method body
Func<int, int, int> addThem = (x, y) => x + y;
BinaryOperation b1 = addThem; // doesn't compile, and casting doesn't compile
BinaryOperation b2 = (x, y) => x + y; // compiles!
Genialny! Dziękuję Ci! (... Musisz poczekać 11 minut, aby zaznaczyć swoją odpowiedź jako odpowiedź ...). – Hobbes
Powodem typowania niestrukturalnego jest to, że definicja delegata może mieć semantykę. Nie powinno być możliwości przypisania "Func" do "SecureFunc", "PureFunc" lub "NoSideEffectsFunc" lub cokolwiek innego. W praktyce nikt właściwie nie robi delegatów, które mają semantykę; gdybyśmy musieli to robić od nowa, delegaci byliby prawdopodobnie bardziej strukturalnie wpisani. –
@Eric Lippert: To interesujący punkt. Jaki jest twój pogląd na to, dlaczego istnieje tylu "zduplikowanych" typów delegatów o tej samej "strukturze" w BCL, takich jak Action, ThreadStart, MethodInvoker? – Ani