受保护的枚举在C#中不可能

时间:2010-03-14 13:55:04

标签: c# language-features

我只想了解为什么我无法在C#上创建受保护的枚举?

编译器拒绝接受

有谁知道为什么会这样?

5 个答案:

答案 0 :(得分:13)

您可以拥有嵌套在另一种类型中的受保护类型 - 包括枚举:

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

但是,保护非嵌套类型没有意义 - 受保护的修饰符是关于从派生类型中授予对成员的访问权限;作为顶级类型只是名称空间的成员而不是另一种类型的成员,没有可以派生的类型来获得额外的访问权。

您能描述一下您实际想要实现的目标,然后我们可以尝试找出最合适的可见度吗?

答案 1 :(得分:6)

可以创建enum protected访问修饰符,如果它是嵌套类型。直接在namespace中创建的类型只能使用publicinternal访问修饰符。直接在private中创建protectedprotected internalnamespace类型没有意义,因为您无法在任何地方使用它(因为您不能从命名空间继承或声明其中的方法。)

答案 2 :(得分:3)

protected修饰符仅在类声明的上下文中有意义 - 它确定标记为protected的项目可以由类及其派生类访问,但不能在上课。

如果您的枚举是类的嵌套枚举,则可以将其声明为protected。

但是,如果它是顶级枚举,则可以是公开的也可以是内部的。当然,公众意味着大会内外的每个人都可以看到它。内部意味着它只能在程序集中显示也许内部是您正在寻找的。

编辑:枚举值在C#中不可继承 - 允许这样做的唯一目的是能够向枚举添加其他值。虽然枚举不可能,但我们可以使用类似于Java的typesafe enum pattern来执行此操作:

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);
}

答案 3 :(得分:1)

你确定你没有在课堂外宣布吗?

在一个类中,它工作正常,但你不能声明一个成员受保护,因为没有任何东西可以派生。如果它是在类中定义的,则可以从中派生,并且可以访问它。

无法从任何地方访问类定义之外的受保护枚举

答案 4 :(得分:1)

嵌套枚举可以被“保护”。

class Test
    {
        protected enum MyEnum
        {
            type1,
            type2
        }
    }