Статическая проверка CodeContracts говорит, что члены внутреннего класса другой сборки недостаточно видимы, несмотря на использование InternalVisibleTo

Я пишу программу в Visual Studio 2012, и у меня есть пара классов в двух отдельных проектах:

ProjectA:

namespace Test
{
  internal class A
  {
    private A(B b)
    {
      Contract.Requires(b.X != null);
    }
  }
}

ProjectB:

namespace Test
{
  internal class B
  {
    public string X;
  }
}

В AssemblyInfo.cs в ProjectB у меня также есть:

[assembly: InternalsVisibleTo("ProjectA")]

Это прекрасно компилируется, пока я не включу статический анализ CodeContract. В этот момент я получаю сообщение об ошибке от ccrewrite: Member 'Test.B.X' has less visibility than the enclosing method Test.A.#ctor(Test.B),

Единственное, что я могу предположить, может быть причиной проблемы, это то, что CodeContract s не знает, что ProjectA может видеть внутренние компоненты ProjectB, и поэтому считает, что класс BВ этом контексте видимость практически отсутствует. Хотя если я изменю утверждение на b != nullКажется, все в порядке, так что, возможно, этот аргумент не выдерживает критики.

Может ли кто-нибудь подтвердить это утверждение или дать мне правильное объяснение, если не считать удаления Requires, отключение CodeContract s или изменение видимости BЕсть ли способ обойти эту ошибку?

1 ответ

Код контракта не знает значения атрибута:

[assembly: InternalsVisibleTo("ProjectA")]

Так что он не знает, что внутренности видны для проекта. InternalsVisibleToAttribute разработан для облегчения тестирования юнитов.

Вам следует подумать о том, почему вы разделяете два класса на разные группы, когда им нужно знать друг друга. Может быть, вы можете решить это с помощью интерфейса и какой-то фабрики.

Другие вопросы по тегам