Защищенное перечисление невозможно в C # - PullRequest
3 голосов
/ 14 марта 2010

Я просто хочу понять, почему я не могу создать защищенное перечисление на C #?

Компилятор отказывается принять это

Кто-нибудь знает, почему это может быть?

Ответы [ 5 ]

13 голосов
/ 14 марта 2010

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

public class Outer
{
    protected enum NestedEnum { Foo, Bar, Baz };
}

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

Не могли бы вы описать, чего вы на самом деле пытаетесь достичь, а затем мы могли бы попытаться выяснить, какой будет наиболее подходящая видимость?

6 голосов
/ 14 марта 2010

Вы можете создать enum с protected модификатором доступа , если это вложенный тип . Типы, созданные непосредственно в namespace, могут принимать только модификаторы доступа public и internal. Не имеет смысла создавать типы private, protected или protected internal непосредственно в namespace, поскольку вы не сможете нигде использовать его (поскольку вы не можете наследовать из пространства имен объявить в нем методы).

3 голосов
/ 14 марта 2010

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

Если ваше перечисление является вложенным перечислением класса, оно может быть объявлено как защищенное.

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

РЕДАКТИРОВАТЬ: значения перечисления не наследуются в C # - единственная цель, позволяющая это сделать, - иметь возможность добавлять дополнительные значения в перечисление. Хотя это невозможно с перечислениями, мы можем использовать типизированный шаблон перечисления , аналогичный Java, чтобы сделать это:

public class BaseEnum 
{
    private readonly int m_Value;

    protected BaseEnum( int val ) { m_Value = val; }

    public static readonly BaseEnum First  = new BaseEnum(1);
    public static readonly BaseEnum Second = new BaseEnum(2);
    public static readonly BaseEnum Third  = new BaseEnum(3);
}

public class DerivedEnum : BaseEnum
{
    protected DerivedEnum( int val ) : base( val ) { }

    public static readonly DerivedEnum Fourth = new DerivedEnum(4);
    public static readonly DerivedEnum Fifth  = new DerivedEnum(5);
}
1 голос
/ 14 марта 2010

Вложенное перечисление может быть «защищено».

class Test
    {
        protected enum MyEnum
        {
            type1,
            type2
        }
    }
1 голос
/ 14 марта 2010

Вы уверены, что не декларируете вне класса?

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

Защищенное перечисление вне определения класса не будет доступно нигде

...