Ich verstehe diese co / contravarianz-Sache wirklich nicht ... Ich kann nicht sowohl generische Methoden zum Abrufen als auch zum Setzen haben.

9

Ich denke, ich werde meine Probleme mit einigen Beispielen erklären.

%Vor%

Also brauche ich Kovarianz ..

%Vor%

Schön, es funktioniert. Dann möchte ich es benutzen:

%Vor%

Alles gut, aber der Repo muss auch Objekte einfügen. Mit einem out-Parameter können wir das nicht machen:

%Vor%

Also versuche ich zwei Parameter hinzuzufügen:

%Vor%

Und ich bekomme den gleichen Fehler wie im ersten Beispiel. Ich bekomme den gleichen Fehler bei der Verwendung von in TInsert

Wie um alles in der Welt könnte ich sowohl das Einfügen als auch das Holen unterstützen?

BEARBEITEN : Ich habe also eine mögliche Lösung gefunden, aber weit von optimaler

%Vor%

EDIT2 : Als Antwort auf Eric: Dies ist ein vollständigeres Beispiel dessen, was ich erreichen möchte. Ich möchte wirklich die Kovarianz, also kann ich die IRepo-Instanzen gruppieren, und ich will immer noch, dass sie add / update-Methoden haben, die das Modell als Instanz verwenden. Ich verstehe, dass ich die Sicherheit beim Kompilieren zum Hinzufügen von Elementen nicht bekommen kann, aber für diesen Anwendungsfall muss ich nur die Elemente lesen.

%Vor%     
simendsjo 09.11.2010, 14:34
quelle

2 Antworten

2

Ich denke, dass Sie Ihre Schnittstelle am besten in zwei Teile aufteilen sollten:

%Vor%

Jetzt können Sie eine List<IReadableRepo<IModel>> erstellen, die Repo Instanzen enthält.

    
kvb 10.11.2010, 16:14
quelle
2

Wenn Sie denselben Objekttyp einfügen und zurückgeben möchten, benötigen Sie Invarianz. Sie müssen nur Ihre Variable mit dieser Absicht deklarieren.

Verwenden Sie Ihr erstes Snippet mit dieser Zeile, um die Repo-Variable zu deklarieren:

%Vor%

Bearbeiten: Ich habe die notwendigen 10 Minuten genommen, um den notwendigen Code zu schreiben. Ich kann Ihnen versichern, dass dieses Bit Code auf meinem Computer kompiliert (auf Visual C # Express):

%Vor%     
Jean Hominal 09.11.2010 15:29
quelle