В чем смысл запланированного модификатора доступа к закрытой защите?

Как часть Roslyn документации по GitHub, есть страница под названием Состояние реализации функции языка, с плановыми языковыми функциями для С# и VB.

Одна особенность, с которой я не мог окутать голову, был private protected модификатор доступа:

private protected string GetId() { … } 

Существует также страница С# Language Design Notes, которая объясняет многие новые функции, но не эту.

Эрик Липперт сказал в comment:

Ваша ошибка заключается в том, чтобы рассматривать модификаторы как возрастающие ограничения. Модификаторы на самом деле всегда уменьшают ограничения. Помните, что по умолчанию это "private"; только добавляя модификаторы, вы делаете их менее ограниченными.

В чем смысл private protected? Когда я могу использовать его?

Ответ 1

В соответствии с " Professional С# 2008" De Bill Evjen и Jay Glynn, страница 1699:

private protected - "только производные типы в текущей сборке"

С++/CLI имеет аналогичную функцию - Определить и использовать классы и структуры (С++/CLI) > Видимость элементов:

private protected -or- protected private - Участник защищен внутри сборки, но закрыт вне сборки.

Ответ 2

Здесь все модификаторы доступа на диаграммах Венна, от более ограничивающих до более беспорядочных:

private:
enter image description here

private protected: ( * предлагаемая функция - в настоящее время недоступна в С#)
enter image description here

internal:
enter image description here

protected:
enter image description here

protected internal:
enter image description here

public:
enter image description here

Ответ 3

Это просто для получения графика (сделанного http://ashitani.jp/gv/) различных уровней доступности (изображения не соответствуют комментариям).

digraph diagram of C# access levels

Каждая стрелка означает "более ограничительная, чем".

Имена CLR: Private, FamilyANDAssembly, Assembly, Family, FamilyORAssembly, Public.

Ответ 4

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

Возможное использование: тогда вы хотите иметь protected для внутренней реализации, но не для внешнего использования (и вы не хотите уплотнять класс).

P.S. Он всегда существовал в CLR, но не в С#. Это комбинация protected и internal, цитата:

CLR также поддерживает тип доступа "Семья и сборка". Это означает, что метод доступен из типов объявлений, вложенных и производных, но только если они объявлены в одной и той же сборке. Ну, очевидно, команда С# не думала об этом как о очень полезной функции, поэтому ее не поддерживали на этом языке.

Ответ 5

"Может быть" видимым только для подклассов, которые находятся в одной сборке. Это делает его немного ограниченным, чем protected.