Почему преобразование с параметрами другого типа НЕ допускается? - PullRequest
0 голосов
/ 21 апреля 2009

Я просто не понимаю, как было бы так полезно преобразовать один универсальный контейнер в другой?

Stack <IType> stack = new Stack<SomeType>();

Ответы [ 3 ]

4 голосов
/ 21 апреля 2009

Вы говорите о таких конверсиях?

IFoo<Child> child = ...;
IFoo<Parent> parent = child;

Если так, то это то, что известно как ковариация. Обычно это в паре с контравариантом. Эта функция действительно недоступна в текущей версии C #. Но он будет доступен в следующей версии C # и VB.Net.

Некоторые статьи о готовящемся выпуске

2 голосов
/ 21 апреля 2009

Хотя то, что говорит @JaredPar, является правдой, есть некоторые обходные пути для коллекций, которые доступны сегодня. Например, вы можете использовать расширение Cast IEnumerable, если есть допустимое приведение типов от одного типа к другому.

List<Foo> list = barList.Cast<Foo>().ToList();

Или вы можете явно конвертировать из одного типа в другой, используя Select.

List<double> dList = intList.Select( i => Convert.ToDouble( i ) ).ToList();

Обратите внимание, что оба эти метода создадут новую коллекцию соответствующего типа, а не просто назначат коллекцию переменной другого типа, которая будет доступна при определенных условиях в следующих версиях C # / VB.

1 голос
/ 21 апреля 2009

Что касается приведенного вами примера:

Stack <IType> stack = new Stack<SomeType>();

Что бы произошло, если бы мы сделали это:

stack.Add(new SomeOtherTypeNotDerivedFromSomeType());

Это основная причина, почему ковариация не разрешена в .Net, я думаю, потому что базовая коллекция для универсального контейнера не обязательно соответствует объявленному типу. Статьи Эрика Липперта детализированы (больше, чем я могу).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...