C# бросают Foo <Панель> Foo <объект>

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

То, что я хочу сделать, имеют набор Foo<object> но смогите добавить Foos с аргументами более определенного типа.

Спасибо

8
задан Eric Lippert 7 April 2010 в 17:53
поделиться

4 ответа

Используйте метод ConvertAll списка (T) или массива.

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

2
ответ дан 5 December 2019 в 21:17
поделиться

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

Вы должны изучить ковариацию .

2
ответ дан 5 December 2019 в 21:17
поделиться

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

// 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...
3
ответ дан 5 December 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: