Fragensteller
Spezialisierung in generischen Schnittstellen

Allgemeine Diskussion
-
Hallo,
in meiner Schnittstelle habe ich einen Benachrichtigung mittels IProgress<MyContact>.
IProgress<IReadOnlyList<MyContact>> progress
Jetzt kann es vorkommen, dass es notwendig ist von MyContact abzuleiten um weitere Funktionen aufzunehmen.
Möchte ich die obige Schnittstellenfunktion aufrufen mit einem Typ der von MyContact abgeleitet ist habe ich ein Problem. Ich habe etwas gelesen, dass der generische Typ mit dem Keyword in bzw. out für solche Zwecke modifiziert werden kann. Leider habe ich dies nicht so ganz verstanden. Kann mir bitte jemand einen kleinen Hinweis geben?
Danke und viele Grüße,
Christian- Typ geändert Ciprian Bogdan Freitag, 21. März 2014 17:52 keine Rückmeldung des Fragestellenden
Alle Antworten
-
Hallo Christian,
Der generische Typ-Parameter in IProgress<T> ist - wie man am "in"-Schlüsselwort sehen kann - als kontravariant definiert:
public interface IProgress<in T> { void Report(T value); }
Wenn man "in" für ein Typparameter angibt (das ist bei IList<T> genauso), funktioniert das wie eine generische Typ-Einschränkung. D.h. man kann mit IProgress entweder genau den Typ verwenden, den man in der Deklaration angegebenen hat (MyContact), oder aber einen weniger abgeleiteten Typ, z.B. einen hypothetischen ContactBase. Aber keinen Typ der von MyContact selbst abgeleitet ist, z.B. MyDerivedContact. Letzeres würde nur in einem kovarianten Szenario, z.B. mit IEnumerable<T> gehen.
Der Unterschied zwischen kovarianten und kontravarianten Typparameter kann leicht anhand von Beispielen erklärt werden. Während IProgress<T> T-Werte empfangen kann:
public interface IProgress<in T> { void Report(T value); }
ist dies bei IEnumerable<T> nicht der Fall, IEnumerable<T> kann T nur zurückgeben:
public interface IEnumerable<out T> : IEnumerable { IEnumerator<T> GetEnumerator(); }
Auch IReadOnlyList<T> ist kovariant, das einzige Problem ist also IProgress<T> und seine kontravariante Einschränkung. Aber wäre die nicht da, wie könnte man noch Typsicherheit gewährleisten und woher wüsste der empfangende Code welche Methoden auf T vorhanden und welche nicht vorhanden sind.
Aber vielleicht habe ich auch nicht genau verstanden, worum es dir geht?
s.a. Varianz in generischen Schnittstellen.
Gruß
Marcel- Bearbeitet Marcel RomaModerator Montag, 2. Dezember 2013 12:25
-
-
Hi Holger,
ich habe Christian so verstanden, dass er eine Methode hat, die ein Parameter vom Typ IProgress<IReadOnlyList<MyContact>> erwartet. Dieser Methode möchte Christian ein Argument vom Typ IProgress<IReadOnlyList<MyDerivedContact>> übergeben. Da IProgress<T> als kontravariant definiert ist scheitert die Umwandlung. Ich kenne keinen Weg, wie man aus IProgress<T> eine kovariante Schnittstelle machen könnte. Kennst Du einen?
Gruß
Marcel -
Hi,
ist dieser Thread noch aktuell ? Bist Du hier inzwischen weitergekommen ?
Gruß,
Ciprian
Ciprian Bogdan, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
*****************************************************************************************************
Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
*****************************************************************************************************Ciprian Bogdan, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.