В случае, если название не совсем понятно, вот код, который меня озадачивает:
public interface IFoo<T>
{
}
public class MyClass : IFoo<MyClass.NestedInMyClass>
{
private class NestedInMyClass
{
}
}
Я удивлен, что это компилируется без ошибок. Такое ощущение, что я выставляю тип private
. Разве это не должно быть незаконным?
Возможно, вашими ответами будут просто "Нет никаких правил, запрещающих это, так почему бы и нет?" Возможно, не менее удивительно, что MyClass.NestedInMyClass
находится даже в "области действия". Если я удалю квалификацию MyClass.
, он не скомпилируется.
(Если я изменяю IFoo<>
на общий класс, который затем должен стать базовым классом MyClass
, это недопустимо, поскольку базовый тип должен быть как минимум таким же доступным, как и тип сам.)
Я попробовал это с компилятором С# 4 Visual Studio 2010.
Foo
добавлен метод, который принимаетT
, реализована реализация (noop), и этот метод можно вызывать для экземпляраMyClass
(хотя я мог передать толькоnull
, чтобы он скомпилировался, так как я не мог получить экземпляр извне) . Обратите внимание, что если метод возвращаетT
, вы получите ошибки компилятора для непоследовательной доступности, выставивNestedInMyClass
извне. - person Servy   schedule 07.01.2013IFoo<T>
, еслиIFoo<T>
содержит какой-либо член, который используетT
. - person Jeppe Stig Nielsen   schedule 07.01.2013T
, то вызывающий абонент никогда не сможет получитьT
, он может передать толькоnull
. Так как никакиеT
не могут быть возвращены таким образом, чтобы публично раскрыть частный класс... - person Servy   schedule 07.01.2013public
, и, конечно же, это дало мне непоследовательную доступность. - person Jeppe Stig Nielsen   schedule 07.01.2013