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