Вопрос по c# – Почему внутренняя защита не более строгая, чем внутренняя?

31

Я хотел бы создать внутреннее авто-свойство:

internal bool IP { get; protected internal set; }

Я думал, что можно было бы сделать сеттерprotected или жеprotected internal - но я всегда получаю ошибкуaccessibility modifier must be more restrictive than the property, Разве это не так?Private мне здесь не поможет

EDIT:
Вопрос заключается в следующем: как реализовать автоматическое свойство с внутренним и защищенным установщиками?

+1 - Эрик Липперт, ты всегда формулируешь это как можно лучше JonH
На самом деле,combination модификаторов естьdecreasing ограничения. Толькоsetting модификатор действительноincreasing ограничения, такие какpublic bool IP{get; private set;} Dani
Ваша ошибка в представлении модификаторов какincreasing ограничения. Модификаторы на самом деле всегдаdecrease ограничения. Помните, что вещи являются "частными" по умолчанию; только добавив модификаторы, вы сделаете их менее ограниченными. Eric Lippert

Ваш Ответ

8   ответов
1

видимые для классов в той же сборке или для классов, производных от содержащего класса - другими словами, они видны тем, кто отвечает внутренним требованиям ИЛИ защищенным требованиям, а не AND. Не существует модификатора доступа, который означает защищенный И внутренний таким образом.

2

protected internal менее строг, чем любойprotected или жеinternal потому что это позволяет оба его подкласса (protected) и прочее в одной сборке (internal) чтобы получить доступ к чему-либо.

1

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

5

что упомянул Джон Скит (и комментарий пользователя 59808), не приведет ли это к желаемому результату?

protected internal bool IP { get; protected set; }

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded tanascius
29

FamilyAndAssembly: more restrictive than either protected or internal FamilyOrAssembly: less restrictive than either protected or internal

& quot; защищенный внутренний & quot; в C # означает FamilyOrAssembly; нет модификатора для FamilyAndAssembly.

Так что вашиprotected internal сеттер менее строг, чемinternal общая собственность. Что вы могли бы сделать, это:

protected internal bool IP { internal get; set; }

Но тогда ваш сеттер менее ограничен, чем ваш геттер, что странно ...

Другая (несколько эквивалентная) альтернатива:

internal bool IP { get; set; }

protected void SetIP(bool ip)
{
    this.IP = ip;
}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded tanascius
Error: User Rate Limit ExceededFamilyAndAssemblyError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded tanascius
Error: User Rate Limit ExceededobeyError: User Rate Limit ExceededexpressingError: User Rate Limit Exceeded
0

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

Компилятор говорит, что нет смысла говорить, чтоset защищен (то есть видимым для подклассов вне сборки), когда всеIP свойство является внутренним (то есть невидимым вне сборки).

5

так как Эрик Липперт сам на SO, но он написал отличную запись в блоге, которая рассматривает эту проблему.

Почему я не могу получить доступ к защищенному члену из производного класса, часть третья

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

Error: User Rate Limit Exceeded
50

protected или жеinternalнеand, Это доступноboth производными классами и типами в одной сборке. Это распространенное заблуждение думатьprotected internal означает доступность только для производных классов в одной сборке.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded tanascius
Error: User Rate Limit Exceeded tanascius

Похожие вопросы