Я использую С# 4.
Комментарии объясняют цель классов и почему они структурированы именно так.
/// <summary>
/// I want this internal just to reduce the number of publicly
/// accessible classes in this assembly. I don't want people to
/// come after me to even spend time reading about this class,
/// since it won't help them unless they're modifying, and not
/// using this assembly.
/// </summary>
internal class MyInternalClass
{
}
/// <summary>
/// This class is an initialization class for tests. This is the
/// base class for other initialization classes so that I can have
/// a tree-like structure of method calls. This needs to be
/// public because it is the base class of a derived class that needs
/// to be public.
/// </summary>
public class MyPublicClass
{
protected internal MyInternalClass MyInternalProperty;
}
/// <summary>
/// This class is a test class that tests a particular initialization
/// class. This class needst to be public, else the Unit Testing
/// framework will not execute its methods.
/// </summary>
public class MyInheritedPublicClass : MyPublicClass
{
}
Кто-нибудь может сказать мне, почему я получаю сообщение об ошибке непостоянной видимости для приведенного выше кода?
Насколько я понимаю, вот значения модификаторов видимости в C#:
public: Все и везде могут видеть и получать доступ к этому без каких-либо хаков отражения.
private: это доступно только в рамках класса, в котором оно объявлено. Производные классы и другие классы в том же пространстве имен и сборке не могут видеть это.
protected: это доступно только в рамках класса, в котором оно объявлено, и любых производных классов, независимо от сборки или пространства имен, при условии, что класс является общедоступным. Если класс является внутренним, то, конечно, это еще больше ограничит классы, которые могут видеть это свойство.
internal: это доступно только для сущностей в одной сборке.
Я думал, что модификатор protected internal будет действовать как пересечение protected и internal в диаграмме Венна - он будет доступен только для сущностей, которые находятся в одной сборке и являются подклассом указанного класса, где свойство/метод/конструктор/поле /все, что существует. Учитывая мои убеждения, я думал, что предыдущий код должен компилироваться.