В отличие от других ответов, не поддерживается в .NET 4.0. Только интерфейсы и делегаты поддерживают общую дисперсию. Однако .NET 4.0 позволит сделать это:
void AMethod(IEnumerable<A> parameter) {}
...
List<B> list = new List<B>();
AMethod(list);
В .NET 3.5 вы можете получить почти то же самое для работы с помощью Cast
:
void AMethod(IEnumerable<A> parameter) {}
...
List<B> list = new List<B>();
AMethod(list.Cast<A>());
Другая альтернатива - сделать AMethod
универсальным:
void AMethod<T>(List<T> parameter) where T : A
...
List<B> list = new List<B>();
AMethod(list); // Implicitly AMethod<B>(list);
Это может или не может делать то, что вам нужно - это зависит от того, что вы делаете в AMethod
. Если вам нужно добавить новые элементы типа A
, у вас будут проблемы - и это правильно. Если вам нужно только получить элементы из из списка, это будет хорошо.