我试图写一个简单的字符串枚举。显然,我通常使用标准枚举,但我需要字符串中的空格。
我试图通过将构造函数设为私有来阻止构造任何其他实例。但是,我还想要一个隐式转换,以使静态声明更容易/更整洁(最后一行)
while(radio.available()){
radio.read(chr, 1);
}
此隐式运算符无法使用&#34编译;修饰符private对此项目无效"。我可以公开它,但其他代码可以构建非枚举成员。我也可以摆脱静态实例,但它看起来像上面那样整洁。
只是想知道为什么你真的没有私人转换操作员,以及是否有人可以建议一种满足我的迂腐的替代方式?
答案 0 :(得分:2)
来自this answer:
至于为什么语言设计师选择要求转换运算符 公开...我想他们可能想避免过多 “神奇”继续与那些运营商一起 - 也就是说,他们不想要代码 在一个组件内以一种完全不同的方式运行 在另一个集会内,没有任何明显的指示 继续。
至于替代方式:您可以使用Description
属性标记枚举成员并使用反射来获得“友好”成员名称:
public enum MyEnum
{
[Description("My Foo Member")]
FooMember,
Bar_Member
}
...
public static string GetFriendlyName(Enum enumValue)
{
var descriptionAttribute = ReflectionUtil.GetAttribute<DescriptionAttribute>(enumValue);
return descriptionAttribute != null
? descriptionAttribute.Description
: enumValue.ToString(); // or .Replace("_", " ") for example
}
答案 1 :(得分:2)
只是想知道为什么你不能拥有私人转换运营商
运算符只是特殊方法的语法糖。在隐式转换的情况下,运算符被编译为类似:
public static string op_Implicit(StringEnum s)
{
// implementation
}
private
方法旨在隐藏实现细节 - 运算符旨在使类外部的代码看起来更清晰。私下来说,创建一个方法来进行转换而不是隐式运算符是非常简单的。因此,拥有私有运营商的价值非常小,因为它只会影响私有接口 - 它根本不会影响公共接口。因此,此功能的好处并不能证明成本(设计,实施,测试,测试以及更多测试,文档和维护)的合理性。
是否有人可以建议一种满足我的迂腐的替代方式?
只需将“转化”设为私有方法而非操作符。