Gibt es eine Problemumgehung für C #, die keine generischen Typargumente mithilfe von Typeinschränkungen ableiten kann?

10

Eric Lippert hat in seinem Blogbeitrag erklärt Ссылка , warum Constraints für die Typinferenz nicht berücksichtigt werden, was sinnvoll ist, da Methoden nicht einfach durch Ändern von Typabhängigkeiten überladen werden können. Ich würde jedoch gerne einen Weg finden, ein Objekt mit zwei generischen Typen zu instanziieren, von denen eine abgeleitet werden kann, und eine andere, die abgeleitet werden könnte, wenn Einschränkungen berücksichtigt würden, ohne einen der Typen angeben zu müssen.

Gegeben die Typen:

%Vor%

und die Fabrik:

%Vor%

Der folgende Code wird nicht kompiliert:

%Vor%

Die Fehlermeldung lautet "Fehler CS0411: Die Typargumente für die Methode 'yo.Factory1.Create (T)' können nicht aus der Verwendung abgeleitet werden. Versuchen Sie, die Typargumente explizit anzugeben.", was dem entspricht, was Eric sagte in seinem Blogbeitrag.

Daher können wir einfach die Argumente des generischen Typs explizit angeben, wie die Fehlermeldung vorschlägt:

%Vor%

Wenn wir keine Typargumente angeben wollen und Typ C nicht beibehalten müssen, können wir die folgende Factory verwenden:

%Vor%

und spezifizieren Sie jetzt:

%Vor%

Ich möchte jedoch den Typ C im zurückgegebenen Objekt behalten und die Typen nicht angeben.

    
jam40jeff 22.12.2012, 15:25
quelle

1 Antwort

5

Ich habe eine Lösung für dieses Problem gefunden, aber es scheint eine Art Workaround zu sein, bei dem das Objekt vom Typ C in einem zweistufigen Factory-Aufruf zweimal verwendet wird.

Um dies zu tun, werden die folgenden Fabriken verwendet:

%Vor%

welches dann wie folgt verwendet werden kann:

%Vor%

Das fühlt sich einfach komisch an, da c zweimal verwendet wird. Beim ersten Mal wird es tatsächlich verworfen, da es nur dazu verwendet wird, das Basistypargument abzuleiten.

Gibt es eine bessere Lösung für dieses Problem, wenn das Objekt nicht zweimal verwendet werden muss und die Typen nicht angegeben werden müssen?

edit: Ich habe gerade festgestellt, dass, obwohl das Objekt zweimal verwendet werden muss, die zweite Factory-Klasse nicht benötigt wird. Vielmehr können beide Parameter in derselben Fabrikmethode wie folgt verwendet werden:

%Vor%

Dies würde wie folgt verwendet:

%Vor%

Es ist immer noch nicht ideal, aber besser, als eine zweite Factory-Klasse erstellen zu müssen, und mindestens XMLDoc-Kommentare könnten verwendet werden, um anzuzeigen, dass beide Parameter dasselbe Objekt sein sollten. Der eine Parameter ( o2 in diesem Fall) wird wiederum nur verwendet, um die eingeschränkten Typen für T abzuleiten.

    
jam40jeff 22.12.2012, 15:25
quelle

Tags und Links