Подтвердить что ты не робот

Сбой сборки в проекте unit test с аксессуарами проекта, содержащего ковариантные типы

Я добавил ковариантный интерфейс к нашему проекту:

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 и не является интерфейсом или делегата.

В чем конкретно проблема? Есть ли отказ в моей реализации, соответственно. как это исправить? Не может быть, что мы должны избегать доступа, как только мы будем использовать ковариантные типы??? Возможно ли предотвратить создание аксессуаров для определенных типов для решения этой проблемы?

4b9b3361

Ответ 1

Это ошибка в Visual Studio 2010. Сообщается Microsoft Connect, но закрыта и, по-видимому, не будет исправлена.

Согласно записи в блоге Брюса Таймана, разработка

Ответ 2

Я боролся с этой ошибкой, а также получил ошибку: "BuildShadowTask" неожиданно завершился. Единственный способ избавиться от ошибки, когда я попытался разрешить ее здесь, - это удалить ключевое слово out из generics, т.е. Ковариантный интерфейс.

На самом деле я получил эту ошибку, когда Решарпер предложил мне, чтобы параметр типа мог быть ковариантным:

private delegate TResult Action<TResult>(); 

Изменено на:

private delegate TResult Action<out TResult>();

К сожалению, мне пришлось изменить его снова и отключить предупреждение Resharper в комментарии:

// ReSharper disable once TypeParameterCanBeVariant 
private delegate TResult Action<TResult>();

Таким образом, одной из стратегий может быть поиск:

"<out"

в проекте и удалите ключевое слово out, просто чтобы его можно было скомпилировать. Не очень элегантный, но не очень элегантный от Microsoft, потому что это было сообщено пять лет назад через Microsoft Connect, и они решили просто закрыть проблему. Проблема заключается в Unit Test проектах. Это не помогает переход от Visual Studio Unit Testing Framework к NUnit Testing Framework.

Ответ 3

Если вы используете Unity Interception и ваш параметр помечен как out, Unity Interception вызовет эту ошибку. Причина этого в том, что перехват должен иметь возможность читать список параметров. Так, как и в случае выше, если Resharper предупреждает, что параметр может быть ковариантным, это предупреждение нужно игнорировать.