Я добавил ковариантный интерфейс для нашего проекта:сбоя сборки в тестовом проекте блока с аксессорами проекта, содержащим общековариантные типами
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();
Так все кажется правильным, поэтому я предполагаю, использование овариации правильное. К сожалению, наши тестовые проекты содержат частные аксессоры из некоторых типов, расположенных в том же проекте, что и ковариантный интерфейс, что приводит к сбою сборки.
Could not load type 'GenericInheritanceTest.IPresenter_Impl`1' from assembly 'GenericInheritanceTest_Accessor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' because it declares a covariant or contravariant type parameter and is not an interface or delegate.
В чем проблема? Есть ли отказ в моей реализации, соответственно. как это исправить? Не может быть, что мы должны избегать доступа, как только мы будем использовать ковариантные типы ??? Возможно ли предотвратить создание аксессуаров для определенных типов для решения этой проблемы?
Вам следует избегать частных аксессуаров в целом - они вызывают слишком жесткую связь между тестами и производственным кодом. – Grzenio
Да, спасибо, но у меня есть уже существующий проект с 120k loc и хорошим использованием частных аксессуаров, поэтому он не будет просто кончиком пальца для его переделки. – Enyra