У меня есть защищенный класс, который я хотел бы сделать свойством внутри общедоступного класса, но доступным для производных классов в той же сборке.

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


person Jesus is Lord    schedule 25.07.2012    source источник


Ответы (1)


protected internal не является пересечением protected и internal, это объединение, что означает, что свойство protected internal будет видно всем потомкам класса независимо от того, в какой сборке они находятся.

Ссылка: http://msdn.microsoft.com/en-us/library/ms173121.aspx

person Serg Rogovtsev    schedule 25.07.2012
comment
Хорошо, тогда вопрос (я приму, как только SO позволит мне; прошло недостаточно времени): как мне получить перекресток? - person Jesus is Lord; 25.07.2012
comment
По словам Рихтера, в C# это невозможно. - person Serg Rogovtsev; 25.07.2012
comment
Спасибо! Я только что посмотрел информацию о защищенном внутреннем союзе пересечений и нашел некоторые ресурсы теперь, когда я знал жаргон. Учитывая ограниченные преимущества, которые давали бы пересечения, и то, что Microsoft имеет ограниченные ресурсы, я вроде как рад, что они не реализовали это. Я мог бы легко двигаться дальше в своем коде, увеличив видимость; Меня больше интересовало узнать больше о C# и о том, почему он не компилируется. Еще раз спасибо! - person Jesus is Lord; 25.07.2012