Почему преобразование между параметрами с разными типами НЕ разрешено?
-
12-09-2019 - |
Вопрос
Я просто не понимаю, почему было бы так полезно преобразовать один универсальный контейнер в другой?
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, я думаю, потому, что базовая коллекция для универсального контейнера не обязательно соответствует объявленному типу.Статьи Эрика Липперта очень подробны (больше, чем я действительно могу).