Ответ 1
Нет. Игнорирование родового типа с разными аргументами типа полностью не связано. Единственный способ получить их в том же списке состоит в том, что в списке используется общий базовый класс или интерфейс общего назначения, как вы это делали.
Вы можете достичь приближения того, что вы хотите, используя ковариантный общий интерфейс:
class A { }
class B : A { }
interface ISub<out T> where T : A
{
// Members go here
}
class Sub<T> : ISub<T> where T : A
{
// Members go here.
}
Что можно использовать следующим образом:
List<ISub<A>> list = new List<ISub<A>>();
list.Add(new Sub<B>());
Вам нужен интерфейс, потому что только интерфейсы могут иметь ковариантные или контравариантные параметры типа.