Краткий ответ: нет, нет пути.
Длинный ответ: Нет, ни в C # 3.0, ни в C # 4.0 нет никакого способа, потому что совместная и контравариантность вообще не поддерживается в C # 3.0 и только для типов делегатов и интерфейсов в C # 4.0.
UPDATE:
Если вы хотите сохранить несколько экземпляров этого класса в списке, независимо от конкретного типа T
, один обходной путь может выглядеть следующим образом:
Создайте интерфейс ITest
, который использует Base
везде, где вы будете использовать T
. Заставьте Test<T>
реализовать этот интерфейс и скрыть методы от ITest
, используя явную реализацию интерфейса. Используйте ITest
в качестве типа параметра для вашего метода.
Пример кода:
class Base
{
public int Info { get; set; }
}
class Derived : Base
{
public int Info2 { get; set; }
}
interface ITest
{
Base Data { get; set; }
}
class Test<T> : ITest
where T : Base
{
public T Data { get { return (T) (((ITest) this).Data); } set { ((ITest) this).Data = value; } }
Base ITest.Data { get; set; }
}
List<ITest> list = new List<ITest>();
list.Add(new Test<Base>());
list.Add(new Test<Derived>());
Если вы просто хотите передать этот класс методу, не требуя конкретного T
, вы также можете сделать свой метод универсальным:
void YourMethod<T>(Test<T> test) where T : Base
{
Console.WriteLine(test.Data.Info);
}
YourMethod(new Test<Base>());
YourMethod(new Test<Derived>());