Что делает публичный конструктор во внутреннем классе

Я видел некоторый код С#, который объявляет класс с модификатором internal, с конструктором public:

internal class SomeClass
{
    public SomeClass()
    {
    }
}

В чем смысл создания открытого конструктора, если видимость всего класса является внутренней, поэтому его можно увидеть только внутри определяющей сборки?

Кроме того, это имеет смысл в случае, если SomeClass является вложенным классом?

Ответ 1

Область internal class переопределяет область конструктора public MyClass(), создавая конструктор internal.

Использование public в конструкторе упрощает обновление класса до public позже, но смущает намерение. Я этого не делаю.

Изменить 3: я пропустил часть вашего вопроса. Это все равно прекрасно, если ваш класс вложен. Вложенность не может иметь никакого значения, даже если она вложен в частный класс в открытом классе в... (см. Спецификация языка С# - 3.5.2 Домены доступности).

EDIT: И, если я помню, если ctor internal, он не может использоваться как общий тип, где существует ограничение, требующее where T : new(), для этого потребуется public конструктор (ссылка спецификация языка С# (версия 4.0) - 4.4.3 Связанные и несвязанные типы).

Изменить 2: Пример кода, демонстрирующий выше

class Program
{
    internal class InternalClass {
        internal InternalClass() { }
    }
    internal class InternalClassPublicCtor {
        public InternalClassPublicCtor() { }        
    }
    internal class GenericClass<T>
        where T : new() {}

    static void Main(string[] args) {
        GenericClass<InternalClass> doesNotCompile = new GenericClass<InternalClass>();
        GenericClass<InternalClassPublicCtor> doesCompile = new GenericClass<InternalClassPublicCtor>();
    }
}

Ответ 2

От MSDN - модификаторы доступа (руководство по программированию на С#):

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

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

Кроме того, предположим, что вы вдруг хотите, чтобы ваш внутренний класс был общедоступным. Гораздо проще просто изменить модификатор доступа в классе, чем все члены.

Ответ 3

Внутреннее ключевое слово - это модификатор доступа для типов и типов. Внутренние члены доступны только в файлах в одной сборке.

Пример: Внутренний модификатор Microsoft