2009-06-30 2 views
29

Я хотел бы создать внутреннее авто-недвижимость:Почему внутренняя защита не является более ограничительной, чем внутренняя?

internal bool IP { get; protected internal set; } 

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

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

+24

Ваша ошибка в мышлении модификаторов как _increasing_ ограничений. Модификаторы на самом деле всегда _decrease_ ограничения. Помните, что все по-умолчанию «закрыто»; только добавляя модификаторы, вы делаете их менее ограниченными. –

+1

+1 - eric lippert вы всегда ставите его наилучшим образом – JonH

+0

На самом деле ** комбинация ** модификаторов является _decreasing_ ограничениями. Только ** установка ** модификатор действительно _increasing_ ограничения, такие как 'public bool IP {get; private set;} ' – Dani

ответ

49

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

+1

OK, как я могу сделать геттер внутренним и сеттер защищенным? – tanascius

+2

Вы не можете. Модификатор доступа Getter/setter должен быть соответствующим подмножеством модификатора доступа к свойствам. –

+2

Моя проблема была действительно недоразумением в том, что защищенные внутренние средства защищены И внутренние - спасибо за указание на это. – tanascius

2

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

1

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

1

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

29

На уровне .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; 
} 
+0

ОК, мое решение может быть внутренним свойством readonly с защищенным фоновым полем. – tanascius

+0

Или ваша эквивалентная альтернатива с помощью частного сеттера тоже будет работать. – tanascius

+0

Мне кажется, (месяцев спустя, конечно), что сеттер по-прежнему доступен «внутренне», который в некотором смысле менее ограничительный, чем защищенный. Чтобы полностью сделать его внутренним геттером и защищенным сеттером, вам нужно было бы защитить void SetIP (значение bool) и внутренний bool GetIP(), а затем иметь частный bool _IP – DevinB

0

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

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

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

5

Я бы рассмотрел этот обман, так как Эрик Липперт тоже сам СО, но он написал прекрасное сообщение в блоге, которое рассматривает эту проблему.

Why Can't I Access A Protected Member From A Derived Class, Part Three

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

+7

Это не «обман». Во что бы то ни стало, отправляйте ссылки. Это экономит мне время. –

5

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

protected internal bool IP { get; protected set; }

+0

Да, так оно и работает. Thx – tanascius

+0

Хотя выбранный ответ более объяснительный, я хочу, чтобы этот ответ был включен, как то, что нужно делать. –

Смежные вопросы