Приведите обобщенный c список формы DerivedClass к BaseClass - PullRequest
3 голосов
/ 29 марта 2020

У меня есть эти два класса

public class A {}
public class B : A {}

И приведение из класса A в класс B работает нормально.

B testB1 = new B();
A testA1 = testB1;
B testB2 = (B)testA1; //this works

Но: Почему это приведение не работает?

List<B> testB1List = new List<B>();
List<A> testA1List = ((IEnumerable<A>)testB1List).ToList();
List<B> testB2List = ((IEnumerable<B>)testA1List).ToList(); //not working

Решение:

List<B> testB1List = new List<B>();
List<A> testA1List = ((IEnumerable<A>)testB1List).ToList();
List<B> testB2List = testA1List.Cast<B>().ToList();

Но почему это так?

1 Ответ

3 голосов
/ 29 марта 2020

Хорошо, метод расширения Cast приводит каждого члена списка к указанному типу, поэтому в вашем примере его можно назначить как List<B>, поскольку все члены списка были преобразованы в B.

Но в В первом примере вы приводите сам IEnumerable, а не члены списка:

(IEnumerable<B>)testA1List

Таким образом, происходит сбой, потому что он пытается привести List<A> к IEnumerable<B>.

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