Доступ модификаторы по свойствам;почему не работает следующее? - PullRequest
6 голосов
/ 15 декабря 2010

Я столкнулся с ошибкой компилятора, которая не имеет для меня никакого смысла. У меня есть свойство internal, и я хочу ограничить его блок set так, чтобы он был доступен только через наследование. Я думал, что это будет работать:

internal bool MyProperty {
    get { return someValue; }
    protected internal set { someValue = value; }
}

Но компилятор говорит, что модификатор доступа в блоке set должен быть более строгим, чем internal - я что-то упустил или protected internal не более ограничивающий, чем internal

Ответы [ 4 ]

9 голосов
/ 15 декабря 2010

protected internal ограничено ;он защищен или внутренним (не и ) - что, следовательно, дополнительно позволяет подклассам из других сборок получать к нему доступ.Вам нужно будет инвертировать:

protected internal bool MyProperty {
    get { return someValue; }
    internal set { someValue = value; }
}

Это разрешит код в вашей сборке, плюс подклассы из других сборок, get it (чтение) - но только код в вашей сборке может set it (write).

3 голосов
/ 15 декабря 2010

Из документации об модификаторах доступа в C #:

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


Для достижения желаемого эффекта вам нужно поменять местами модификаторы доступа, например так:

protected internal bool MyProperty
{
    get { return someValue; }
    internal set { someValue = value; }
}
2 голосов
/ 15 декабря 2010

Нет, это объединение двух, а не пересечение;следовательно, protected internal менее строг, чем оба из них в отдельности.Пересечение не является особенностью C #;CLR поддерживает «Family AND Assembly», но C # поддерживает только «Family OR Assembly».

1 голос
/ 15 декабря 2010

Здесь protected internal менее ограничен, чем internal.

  • protected internal - public для текущей сборки и любого типа, который наследует этот тип в других сборках.

  • internal - публично для этой сборки и приватно для других сборок

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