私有隐式转换运算符的替代

时间:2015-07-14 16:30:45

标签: c# private implicit-conversion

我试图写一个简单的字符串枚举。显然,我通常使用标准枚举,但我需要字符串中的空格。

我试图通过将构造函数设为私有来阻止构造任何其他实例。但是,我还想要一个隐式转换,以使静态声明更容易/更整洁(最后一行)

while(radio.available()){
    radio.read(chr, 1);
}

此隐式运算符无法使用&#34编译;修饰符private对此项目无效"。我可以公开它,但其他代码可以构建非枚举成员。我也可以摆脱静态实例,但它看起来像上面那样整洁。

只是想知道为什么你真的没有私人转换操作员,以及是否有人可以建议一种满足我的迂腐的替代方式?

2 个答案:

答案 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方法旨在隐藏实现细节 - 运算符旨在使类外部的代码看起来更清晰。私下来说,创建一个方法来进行转换而不是隐式运算符是非常简单的。因此,拥有私有运营商的价值非常小,因为它只会影响私有接口 - 它根本不会影响公共接口。因此,此功能的好处并不能证明成本(设计,实施,测试,测试以及更多测试,文档和维护)的合理性。

  

是否有人可以建议一种满足我的迂腐的替代方式?

只需将“转化”设为私有方法而非操作符。