InvalidCastException, может включать дженерики - PullRequest
1 голос
/ 22 мая 2019

У меня есть следующие классы:

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, поэтому приведение является обязательным.)

1 Ответ

1 голос
/ 22 мая 2019

BSpecific наследуется от BBase<A>, а не BBase<IA>.

Либо сделайте BSpecific наследуемым от BBase<IA>, либо приведите BSpecific к IB<A>, и ваш код скомпилируется.

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