Generische Methode mit ActionT-Parameter

8

Also, ich bin mir sicher, dass das irgendwo draußen schon einmal beantwortet wurde, aber ich konnte es nirgends finden. Hoffe, dass einige Generika Guru helfen können.

%Vor%
  1. Der Argumenttyp 'Orang-Utan' kann nicht dem Parametertyp 'T'
  2. zugewiesen werden
  3. Argumenttyp 'IAnimal' ist nicht dem Parametertyp 'T'
  4. zuweisbar

Bearbeiten: Basierend auf den Vorschlägen von Yuriy und anderen könnte ich einige Castings wie:

machen %Vor%

Ich wollte die ValidateUsing-Methode folgendermaßen aufrufen:

%Vor%

Leider, wenn foo so aussieht:

%Vor%

Ich muss den Typ explizit angeben, wenn ich ValidateUsing

aufruft %Vor%     
Matt Hornsby 24.11.2009, 18:48
quelle

5 Antworten

6

Warum instanzierst du Orangutan , wenn du IAnimal akzeptieren sollst?

%Vor%

Wenn Sie Ihren generischen Parameter wiederverwenden, haben Sie keine Probleme mit dem Typ ...

Nun, im Hinblick darauf, warum Ihr Code nicht funktioniert, sagen Sie nur, dass der Typ T von IAnimal abgeleitet wird. Es könnte jedoch auch einfach ein Giraffe als Orangutan sein, also können Sie nicht einfach einen Orangutan oder IAnimal einem Parameter vom Typ T zuweisen.

    
bdukes 24.11.2009, 18:59
quelle
4

Die Sache ist, dass T für einige Typen steht, die übrigens INimal implementieren.

Wenn Sie also versuchen, action(new Organatum()) zu kompilieren, erhalten Sie einen Fehler, weil Sie angegeben haben, dass die Aktion einen Parameter vom Typ T annehmen soll, der wiederum vom Typ sein könnte, sagen wir Fish - you Organatum kann nicht in Fish umgewandelt werden, oder?

Wenn Sie eine Aktion auslösen wollen, die Parameter eines Typs enthält, der IAnimal interface implementiert, dann vergessen Sie einfach Generics und verwenden Sie Action<IAnimal> .

HTH.

    
archimed7592 24.11.2009 19:04
quelle
2

Nehmen Sie die folgenden Änderungen vor:

%Vor%     
Yuriy Faktorovich 24.11.2009 18:59
quelle
2

Versuchen Sie es.

%Vor%     
Stan R. 24.11.2009 18:56
quelle
0
%Vor%

Es scheint auch, dass die Tatsache, dass es eine Schnittstelle ist, einen Unterschied macht. Wenn Sie eine abstrakte Klasse Animal anstatt einer Schnittstelle hätten, könnten Sie das tun:

%Vor%     
climbage 24.11.2009 19:00
quelle

Tags und Links