2010-04-07 8 views
7

weiß jemand, ob es möglich ist, einen generischen Typ mit einem bestimmten Typparameter (zB Bar) in denselben generischen Typ zu konvertieren, wobei der Typparameter ein Basistyp von Bar ist (wie Objekt) in meinem Fall). Und wenn es möglich wäre, wie würde es gemacht werden?C# cast Foo <Bar> to Foo <object>

Was ich tun möchte, ist eine Sammlung von Foo<object>, aber in der Lage, Foos mit spezifischeren Typ Argumente hinzuzufügen.

Dank

+0

Codebeispiel .. – Nix

+2

Für die Zukunft helfen würde, das ist Kovarianz genannt. C# 4 verfügt über diese Funktion für Schnittstellen und Delegaten. –

+0

siehe http://StackOverflow.com/Questions/245607/ – Cheeso

Antwort

2

Verwenden Sie die ConvertAll Methode der List (T) oder Array.

http://msdn.microsoft.com/en-us/library/73fe8cwf.aspx

+3

Er hat nicht wirklich angegeben, dass er mit 'List ' gearbeitet hat, obwohl ... –

+1

Er hat keine genauen Angaben gemacht. Die ConvertAll-Funktion oder List (T) oder Array sind an diesen Stellen besonders praktisch, auch wenn Sie von einer Sammlung in eine andere konvertieren müssen. – vfilby

2

Ja ist es möglich, in C# 4.0!

Sie sollten in covariance suchen.

+1

Dies ist nicht korrekt. Sie sollten sagen "Ja, es ist ab C# 4 möglich". –

+0

Und das war eigentlich nicht das, was er tun wollte, wenn Sie den Text lesen ... –

+0

Technisch ist es in C# 4 nicht wirklich verfügbar, da Sie nur Kovarianz auf Interfaces und Delegates haben können, nicht auf Typen im Allgemeinen. – jbtule

3

Sie können eine Sammlung eines Basistyps mit hinzugefügten Unterklassen erstellen. Zum Beispiel werden folgende Arbeiten:

// Using: 
public class Foo {} // Base class 
public class Bar : Foo {} // Subclass 

// Code: 
List<Foo> list = new List<Foo>(); 
HashSet<Foo> hash = new HashSet<Foo>(); 

list.Add(new Bar()); 
list.Add(new Foo()); 

hash.Add(new Bar()); 

Da „Bar“ ist eine bestimmte Art von „Foo“, dann ist es vollkommen legal, es zu einer Sammlung von Foo hinzuzufügen.

jedoch bis .NET 4 und die out modifier für Kovarianz, können Sie nicht tun:

IEnumerable<Foo> list = new List<Bar>(); // This isn't supported in .NET 3.5... 
+5

Eigentlich können Sie das auch nicht in .NET 4 tun. 'IList ' ist weder gleich- noch kontravariant, weil T sowohl als Parameter (in Add) als auch als Rückgabewerte (im Indexer) angezeigt wird. Mit 'IEnumerable ' funktioniert es. –

+0

@Martinho: Ja, stimmt - ich habe es repariert - danke, dass du das herausgebracht hast. –

Verwandte Themen