C # приведение Foo <Bar>к Foo <object> - PullRequest
8 голосов
/ 07 апреля 2010

Кто-нибудь знает, возможно ли привести универсальный тип с определенным параметром типа (например, Bar) к тому же универсальному типу с параметром типа, являющимся базовым типом Bar (например, объект в моем случае). И, если это возможно, как это будет сделано?

Что я хочу сделать, так это иметь коллекцию Foo<object>, но иметь возможность добавлять Foos с более конкретными аргументами типа.

Спасибо

Ответы [ 4 ]

3 голосов
/ 07 апреля 2010

У вас может быть коллекция базового типа с добавленными подклассами.Например, будет работать следующее:

// 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());

Так как «Bar» - это определенный тип «Foo», совершенно законно добавлять его в коллекцию Foo.

Однако,до .NET 4 и модификатора out для ковариации вы не можете выполнить:

IEnumerable<Foo> list = new List<Bar>(); // This isn't supported in .NET 3.5...
2 голосов
/ 07 апреля 2010

Да, это возможно в C # 4.0!

Вы должны посмотреть на ковариацию .

2 голосов
/ 07 апреля 2010

Используйте метод ConvertAll для List (T) или Array.

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

0 голосов
/ 07 апреля 2010
...