替代私有隐式转换运算符

Alternative to private implicit conversion operators

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

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

public class StringEnum
{
    public static StringEnum Foo      = "A Foo";
    public static StringEnum Bar      = "A Bar";
    public static StringEnum Wibble   = "A Wibble";
    public static StringEnum Crotchet = "A Crotchet";
    //etc...

    //implicit cast to string
    public static implicit operator string(StringEnum s) { return s.privateString; }

    //private construction
    private string privateString;      
    private StringEnum(string s) { this.privateString = s; }
    private static implicit operator StringEnum(string s) { return new StringEnum(s); }
}  

此隐式运算符无法使用 "The modifier private is not valid for this item" 进行编译。我可以使它 public 但其他代码可以构造非枚举成员。我也可以摆脱并新建静态实例,但它看起来比上面更整洁。

只是想知道为什么你真的不能拥有私有转换运算符,是否有人可以提出一种满足我学究气的替代方法?

来自this answer

As to why the language designers chose to require conversion operators to be public… I suppose they probably wanted to avoid having too much 'magic' going on with those operators—that is, they didn't want code to function one way inside one assembly and a completely different way inside another assembly without any obvious indication of what was going on.

至于替代方法:您可以使用 Description 属性标记枚举成员并使用反射来获取 'friendly' 成员名称:

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
}

Just wondered why you can't have private conversion operators

运算符只是特殊方法的语法糖。在隐式转换的情况下,运算符被编译为类似:

public static string op_Implicit(StringEnum s)
{
    // implementation
}

private 方法旨在隐藏实现细节 - 运算符旨在使 class 的 外部 代码看起来更清晰。私下里,创建一个方法来进行转换而不是隐式运算符会非常简单。因此,拥有私有运算符的价值很小,因为它只会影响私有接口——它根本不会影响 public 接口。因此,这种功能的好处并不能证明成本(设计、实施、测试、测试以及更多测试、文档和维护)

and whether someone can suggest an alternative way that satisfies my pedantry?

只需将 "conversion" 设为私有方法而不是运算符即可。