Der Compiler sagt mir, dass Task<Result>
nicht implizit in Task<ResultBase>
konvertiert werden kann. Kann jemand erklären, warum das so ist? Ich hätte erwartet, dass die Kovarianz es mir ermöglicht, den Code auf diese Weise zu schreiben.
Nach jemand, der vielleicht Bescheid weiß ...
Die Begründung ist, dass der Vorteil der Kovarianz aufgewogen wird durch der Nachteil von Unordnung (d. h. jeder würde einen machen müssen Entscheidung darüber, ob Task oder ITask in jedem einzelnen Fall verwendet werden sollen Platz in ihrem Code).
Es klingt für mich so, als gäbe es keine sehr zwingende Motivation. ITask<out T>
würde eine Menge neuer Überladungen erfordern, wahrscheinlich ein wenig unter der Haube (ich kann nicht bestätigen, wie die tatsächliche Basisklasse implementiert ist oder wie speziell sie im Vergleich zu einer naiven Implementierung ist), aber viel mehr in Form dieser linq
- ähnliche Erweiterungsmethoden.
Jemand anderes hat einen guten Punkt gemacht - die Zeit wäre besser ausgegeben worden, um class
es kovariant und kontravariant zu machen. Ich weiß nicht, wie schwer das wäre, aber das klingt nach einer besseren Nutzung der Zeit für mich.
Andererseits hat jemand erwähnt, dass es sehr cool wäre, eine echte yield return
like-Funktion in einer async
-Methode verfügbar zu haben. Ich meine, ohne Fingerfertigkeit.
Ich merke, dass ich zu spät zur Party komme, aber hier ist eine Erweiterungsmethode, die ich verwendet habe, um dieses fehlende Feature zu erklären:
%Vor%Auf diese Weise können Sie einfach Folgendes tun:
%Vor%Tags und Links c# covariance task