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

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

internal bool IP { get; protected internal set; }

Я думал, что можно было бы сделать сеттер protected или же protected internal - но я всегда получаю, что модификатор доступности ошибок должен быть более строгим, чем свойство. Разве это не так? Private мне здесь не поможет

РЕДАКТИРОВАТЬ:
Вопрос заключается в следующем: как реализовать автоматическое свойство с внутренним и защищенным установщиками?

8 ответов

Решение

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

На уровне.NET есть два похожих, но разных уровня доступа:

  • FamilyAndAssembly: более строгий, чем защищенный или внутренний
  • FamilyOrAssembly: менее строгий, чем защищенный или внутренний

"защищенный внутренний" в 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;
}

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

protected internal bool IP { get; protected set; }

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

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

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

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

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

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

модификатор доступности должен быть более строгим, чем свойство

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

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

Другие вопросы по тегам