Почему преобразование между параметрами с разными типами НЕ разрешено?

StackOverflow https://stackoverflow.com/questions/770951

Вопрос

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

Stack <IType> stack = new Stack<SomeType>();
Это было полезно?

Решение

Вы говорите о подобных конверсиях?

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

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

Несколько статей о предстоящем выпуске

Другие советы

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

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

Или вы могли бы явно преобразовать один тип в другой с помощью Select .

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

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

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

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

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

stack.Add(new SomeOtherTypeNotDerivedFromSomeType());

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top