expliziter Konvertierungsoperatorfehler beim Konvertieren generischer Listen

7

Ich erstelle einen expliziten Konvertierungsoperator, um zwischen einer generischen Liste von Entitätstypen in eine generische Liste von Modelltypen zu konvertieren. Weiß jemand, warum ich den folgenden Fehler bekomme:

  

Benutzerdefinierte Konvertierung muss in den oder vom umgebenden Typ konvertiert werden

Ich habe bereits einen expliziten Konvertierungsoperator zwischen Entity.objA und Model.objA, der gut funktioniert. Das Problem tritt auf, wenn versucht wird, die generische Liste zu konvertieren. Ist das überhaupt möglich?

Hier ist mein Code:

%Vor%

Danke für jede Hilfe.

    
Keith 28.12.2009, 22:38
quelle

2 Antworten

17

Der Fehler "Benutzerdefinierte Konvertierung muss in oder aus dem umschließenden Typ konvertiert werden" sagt genau, was es bedeutet. Wenn Sie einen Konvertierungsoperator haben

%Vor%

Dann muss xxx MyClass sein. Dies ist gemeint mit der "Konvertierung muss in oder von dem umschließenden Typ konvertiert werden". Der einschließende Typ ist hier MyClass .

Der relevante Abschnitt der ECMA334 C # -Spezifikation ist 17.9.4:

  

Ein Konvertierungsoperator konvertiert von einem Quelltyp, der durch den Parametertyp des Konvertierungsoperators angegeben wird, in einen Zieltyp, der durch den Rückgabetyp des Konvertierungsoperators angegeben wird. Eine Klasse oder Struktur darf nur dann eine Umwandlung von einem Quelltyp S in einen Zieltyp T deklarieren, wenn alle folgenden Aussagen wahr sind, wobei S0 und T0 die Typen sind, die sich aus dem Entfernen des nachfolgenden ergeben? Modifikatoren, falls vorhanden, von S und T:

     

S0 und T0 sind verschiedene Typen.

     

Entweder S0 oder T0 ist der Klassen- oder Strukturtyp, in dem die Operatordeklaration stattfindet.

     

Weder S0 noch T0 ist ein Interface-Typ.

     

Wenn Sie benutzerdefinierte Konvertierungen ausschließen, gibt es keine Konvertierung von S nach T oder von T nach S.

Also hier ist dein Code:

%Vor%

Das Problem besteht darin, dass dies als Konvertierungsoperator definiert werden muss, der sich in den Klassen List<Model.objA> oder List<Entity.objA> befinden muss, aber natürlich können Sie das nicht tun, da Sie diese Typen nicht ändern können.

Sie könnten Enumerable.Select verwenden, um zum anderen Typ zu projizieren, oder List<T>.ConvertAll . Zum Beispiel:

%Vor%     
jason 28.12.2009, 22:42
quelle
2

Grundsätzlich können Sie das nicht tun. In Ihrem Operator muss entweder der Eingabe- oder der Ausgabetyp von dem Typ sein, der den Operator deklariert. Eine Option könnte eine Erweiterungsmethode sein, aber um ehrlich zu sein, kommt LINQ Select ziemlich nahe, ebenso wie List<T>.ConvertAll .

Als Beispiel für den Ansatz der Erweiterungsmethode:

%Vor%

oder allgemeiner mit LINQ Select :

%Vor%

und verwende einfach someList.ToModel() .

    
Marc Gravell 28.12.2009 22:40
quelle