Eric Lippert hat diese Frage bereits viel besser beantwortet als ich es könnte.
Sehen Sie sich seine Serie über Kovarianz und Kontravarianz in C#
et
Wie funktioniert C# 4.0 Generic Covariance & Contra-variance Implmeneted?
EDIT: Eric wies darauf hin, dass er nicht über die Konvarianz des Rückgabetyps spricht, aber ich beschloss, den Link in dieser Antwort zu belassen, da es sich um eine coole Artikelserie handelt und jemand sie nützlich finden könnte, wenn er nach diesem Thema sucht.
Diese Funktion wurde angefordert und vor fast 5 Jahren hat Microsoft mit "Danke, dass Sie das protokolliert haben" geantwortet. Wir hören diesen Wunsch sehr oft. Wir werden es in der nächsten Version berücksichtigen."
Und jetzt zitiere ich Jon Skeet, denn es wäre keine richtige Antwort auf StackOverflow ohne eine Antwort von Jon Skeet. Kovarianz und ungültige Rückgabearten
Ich vermute stark, dass die Antwort in der Implementierung der CLR liegt liegt und nicht in irgendeinem tiefen semantischen Grund - die CLR muss wahrscheinlich wissen, ob es einen Rückgabewert gibt oder nicht einen Rückgabewert geben wird, damit sie Dinge mit dem Stack zu tun. Trotzdem scheint es ein bisschen schade zu sein, im in Bezug auf die Eleganz. Ich kann nicht sagen, dass ich dass ich das im wirklichen Leben jemals für nötig Leben, und es wäre relativ einfach zu fälschen (für bis zu vier Parameter) in .NET 3.5 zu fälschen, indem man einfach einen Konverter schreibt von Func<X>
zu Action<X>
, Func<X,Y>
zu Action<X,Y>
usw. Es nervt ein bisschen aber :)