Преобразуйте Список объектов к Списку интерфейсов

если у меня есть objectA, который реализует ISomeInterface

почему не может я делать это:

List<objectA> list = (some list of objectAs . . .)

List<ISomeInterface> interfaceList = new List<ISomeInterface>(list);

почему я не могу всунуть список в interfaceList конструктора? Есть ли какое-либо обходное решение?

11
задан itowlson 4 January 2010 в 05:46
поделиться

2 ответа

В C# 3.0 + .Net 3.5 и выше это можно исправить следующим образом

List<ISomeInterface> interfaceList = new List<ISomeInterface>(list.Cast<ISomeInterface>());

Причина, по которой это не работает, заключается в том, что конструктор для List в данном случае принимает значение IEnumerable. Тип переменной списка, однако, конвертируется только в IEnumerable. Хотя objectA может быть конвертирован в ISomeInterface, тип IEnumerable не конвертируется в IEnumerable.

Это изменяется, однако, в версии C# 4.0, которая добавляет поддержку Co и Contravariance в язык и допускает такие преобразования.

23
ответ дан 3 December 2019 в 03:35
поделиться

Это рассматривается в C# 4.0, вы не можете сделать это в C# 3.5 напрямую. Однако, вы можете создать новый список из этого списка и использовать оператор расширения или foreach, чтобы сделать это чисто, хотя и медленнее, чем кастинг к типу, который будет предоставлен ковариацией contravariance (всегда получается неправильно) в C# 4.

.
1
ответ дан 3 December 2019 в 03:35
поделиться
Другие вопросы по тегам:

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