Ответ 1
Доступ по умолчанию для всех в С# - это "самый ограниченный доступ, который вы могли бы объявить для этого члена.
Итак, например:
namespace MyCompany
{
class Outer
{
void Foo() {}
class Inner {}
}
}
эквивалентно
namespace MyCompany
{
internal class Outer
{
private void Foo() {}
private class Inner {}
}
}
Единственное исключение из этого заключается в том, что одна часть свойства (обычно это сеттер) более ограничена, чем объявленная доступность самого свойства:
public string Name
{
get { ... }
private set { ... } // This isn't the default, have to do it explicitly
}
Это то, что должна сказать спецификация С# 3.0 (раздел 3.5.1):
В зависимости от контекста, в котором декларация участника имеет место только определенные типы заявленных доступность разрешена. Кроме того, когда декларация участника не содержит модификаторов доступа, контекст, в котором декларация имеет значение по умолчанию объявленной доступности.
- Пространства имен неявно имеют общедоступную объявленную доступность. Нет доступа модификаторы разрешены в пространстве имен деклараций.
- Типы, объявленные в единицах компиляции или пространствах имен, могут иметь общедоступные или внутренняя заявленная доступность и по умолчанию объявлено внутренним доступность.
- Члены класса могут иметь любой из пяти видов объявленной доступности и по умолчанию объявлен закрытый доступность. (Обратите внимание, что тип объявленный как член класса, может иметь любой из пяти видов объявленных доступность, тогда как тип, объявленный поскольку член пространства имен может иметь только публичные или внутренние объявленные доступность.)
- Члены структуры могут иметь открытый, внутренний или закрытый объявленный доступность и по умолчанию для частных объявлена доступность, потому что структуры неявно запечатаны. Участники проекта введенный в структуру (т.е. не унаследованный этой структурой) не может защищенные или защищенные внутренние объявленная доступность. (Заметим, что тип, объявленный как член структуры может иметь открытый, внутренний или частный объявленной доступности, тогда как тип объявлен как член пространства имен могут иметь только общедоступные или внутренние объявленная доступность.)
- Члены интерфейса неявно имеют общедоступную объявленную доступность. нет модификаторы доступа разрешены объявления участников интерфейса.
- Члены перечисления неявно имеют общедоступную декларируемую доступность. нет модификаторы доступа разрешены перечисления участников.
(Обратите внимание, что вложенные типы будут принадлежать элементам "члены класса" или "члены структуры", и, следовательно, по умолчанию будут отображаться конфиденциальные.)