ОШИБКА: модификатор доступа установленного метода доступа должен быть более строгим, чем свойство или индексатор - PullRequest
8 голосов
/ 20 июля 2010

Я немного путаюсь со средствами доступа к свойствам.

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

что-то вроде этого

internal [internalClass] MyProperty
{
get {return _prop;}
protected set {_prop = value;}
}

когда я делаю это, компилятор жалуется.

MSDN, при обсуждении этой конкретной ошибки предлагается изменить модификатор доступа set на private

, что не там, где я хочу, чтобы это происходило.

похоже, что Protected Internal здесь должна быть опция, однако использование этого модификатора дает ту же ошибку

У меня такое ощущение, что мне не хватает базового понимания модификаторов доступа.

спасибо

Ответы [ 3 ]

10 голосов
/ 20 июля 2010

Ни protected, ни protected internal не являются более строгими, чем internal. Оба позволят производным типам из другой сборки обращаться к установщику, но не к получателю. protected internal дает доступ к объединению из protected и internal, а не к пересечению . (Существует уровень доступа, представляющий пересечение в CLR, но он не предоставляется C #.)

Лучше всего использовать приватный сеттер и защищенный метод SetMyProperty, который просто вызывает приватный сеттер, если он соответствует тому, чего вы хотите достичь.

2 голосов
/ 20 июля 2010

Внутренний более ограничительный, чем защищенный. Внутренний делает член ограниченным текущей сборкой, тогда как защищенный доступен произвольному большому количеству потомков за пределами вашей сборки.

Если вы намерены сделать это свойство доступным для классов или потомков за пределами вашей сборки, вам нужно будет потерять внутренний атрибут свойства. Если вы намерены использовать это свойство только в вашей сборке, сделайте метод доступа к свойству внутренним.

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

0 голосов
/ 20 июля 2010

По какой-то причине компилятор, похоже, считает, что внутреннему классу разрешено иметь производные классы в других сборках. Защищенное поле считается доступным для других сборок через производный класс (то есть поле не имеет понятия о модификаторе доступа своего класса). Ошибка компилятора указывает на то, что (даже если вы знаете, что это никогда не произойдет), указанное поле переоценивает свои права доступа.

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