У меня есть следующие классы:
public interface IA
{
}
public class A : IA
{
}
public interface IB<T> where T : IA
{
Foo SomeMethod(T someObject);
}
public abstract class BBase<T> : IB<T> where T : IA
{
// implements SomeMethod();
}
public class BSpecific: BBase<A>
{
// overrides SomeMethod();
}
Это вызывает исключение во время выполнения:
var foo = ((IB<IA>)Activator.CreateInstance("BSpecific"));
System.InvalidCastException: Невозможно привести объект типа BSpecific к типуIB'1 [IA]
Приведение к BBase вызывает то же исключение.
Почему я получаю исключение Невозможно сотворить здесь - очень похожий сценарий, но рекомендуемый ответ (используйте контрастность / "out T") не работает для моей ситуации из-за SomeMethod (), который принимает параметр T.
Я не совсем уверен, зачем мне нужна контрвариантность(или что именно делает контравариантность).Тип и класс приводятся к интерфейсу, который они реализуют, поэтому ...?
Есть ли что-то еще, что я могу сделать?
(Код, содержащий приведение, используется в качестве ссылкипроектом, содержащим класс BSpecific
, но сам не знает, что такое BSpecific
, поэтому приведение является обязательным.)