2009-06-19 4 views

ответ

67

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

public class Outer 
{ 
    protected class Foo 
    { 
    } 
} 

Это нормально, это означает, что только классы позволили увидеть Foo являются суб классы Outer

class X 
{ 
    // 'Outer.Foo' is inaccessible due to its protection level 
    private void Flibble(Outer.Foo foo) 
    { 
    } 
} 

class X : Outer 
{ 
    // fine 
    private void Flibble(Outer.Foo foo) 
    { 
    } 
} 

Обратите внимание, что вы не можете объявить какой-либо внешний класс как закрытый, защищенный (или защищенный внутренний) в C#, поскольку модификатор доступа для классов внешнего уровня определяет их видимость по отношению к другим сборкам. Специально видимый только в сборке (или для друзей через InternalsVisibleTo) или вне сборки.

Таким образом, в то время как государственные/внутренние идентификаторы используются здесь для согласования действительно государство в IL просто «Public» или «непубличный» (как Reflection.Emit flags show) видимость

+0

+1 четкость примера. –

11

protected используется для обозначения «видна производных классов ». Это имеет смысл в вещах внутри класса, но обычно не имеет смысла на уровне класса.

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

3

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