Почему внутренняя защита не более строгая, чем внутренняя?
Я хотел бы создать внутреннее авто-свойство:
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
свойство является внутренним (то есть невидимым вне сборки).