Warum ist TaskT nicht co-variant?

36
%Vor%

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.

    
chosenbreed37 23.06.2015, 07:54
quelle

2 Antworten

17

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.

    
tacos_tacos_tacos 23.06.2015, 07:58
quelle
6

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%     
Sergio0694 22.01.2017 12:42
quelle

Tags und Links