如何为C#中public enum的特定值设置internal访问修饰符?
在C#中无法为单个枚举成员设置不同的访问修饰符
很遗憾,你想要的这种写法在C#里是完全行不通的,而且会直接触发编译错误。
原因很简单:
C#的枚举类型规则里明确规定:枚举成员不能拥有独立的访问修饰符,所有枚举成员的可见性完全继承自枚举类型本身。也就是说,如果你的枚举是public,那所有成员都会是public;如果枚举是internal,所有成员也都是internal——你没办法单独给某一个成员设置不同的访问级别。
你贴的这段代码:
public enum Numbers { One, Two, Three, internal Zero // I want zero as internal }
编译器会直接报错,因为internal修饰符不能用在枚举成员上。
替代方案
如果你确实需要让Zero只在程序集内部可见,同时其他成员对外公开,可以试试这两种思路:
1. 拆分枚举类型
把内部使用的成员和公开成员拆成两个枚举:
// 对外公开的枚举,只包含需要暴露的成员 public enum Numbers { One, Two, Three } // 程序集内部使用的完整枚举,包含Zero internal enum InternalNumbers { One, Two, Three, Zero }
内部代码里可以通过类型转换在两个枚举间切换,比如(InternalNumbers)Numbers.One,这样既保证了对外的封装性,内部又能使用完整的枚举值。
2. 用内部常量封装Zero
如果不想拆分枚举,可以把整个Numbers设为public,然后用一个内部类来封装Zero的使用:
public enum Numbers { One, Two, Three } // 仅程序集内部可见的类,封装Zero的常量 internal static class InternalNumberHelpers { // 用强类型的枚举值封装,确保类型安全 public static readonly Numbers Zero = (Numbers)3; }
内部代码里直接用InternalNumberHelpers.Zero来指代这个值,外部代码看不到这个内部类,自然也就无法访问Zero。
内容的提问来源于stack exchange,提问作者VenkyDhana
相关产品推荐
相关产品推荐

