Я добавил ковариантный интерфейс к нашему проекту:
interface IView
{
}
interface IPresenter<out TView> where TView : IView
{
TView View { get; }
}
Я создал несколько классов, реализующих эти интерфейсы:
class TestView : IView
{
}
class TestPresenter : IPresenter<TestView>
{
public TestView View
{
get { return something; }
}
private void DoSomething()
{
}
}
И я могу использовать это без проблем:
IPresenter<IView> presenter = new TestPresenter();
Итак, все кажется правильным, поэтому я предполагаю, что мое ковариационное использование правильное. К сожалению, наши проекты unit test содержат частные аксессоры из некоторых типов, расположенных в том же проекте, что и ковариантный интерфейс, что приводит к сбою сборки.
Не удалось загрузить тип 'GenericInheritanceTest.IPresenter_Impl`1' от сборки "GenericInheritanceTest_Accessor, Версия = 0.0.0.0, Культура = нейтральная, PublicKeyToken = null ', потому что это объявляет ковариантный или контравариантный type и не является интерфейсом или делегата.
В чем конкретно проблема? Есть ли отказ в моей реализации, соответственно. как это исправить? Не может быть, что мы должны избегать доступа, как только мы будем использовать ковариантные типы??? Возможно ли предотвратить создание аксессуаров для определенных типов для решения этой проблемы?