Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 私有隐式转换运算符的替代方法_C#_Private_Implicit Conversion - Fatal编程技术网

C# 私有隐式转换运算符的替代方法

C# 私有隐式转换运算符的替代方法,c#,private,implicit-conversion,C#,Private,Implicit Conversion,我正在尝试编写一个简单的字符串枚举。显然,我通常使用标准枚举,但字符串中需要空格 我试图通过将构造函数设置为私有来阻止任何其他实例的构造。然而,我还希望进行隐式转换,使静态声明更容易/更整洁 public class StringEnum { public static StringEnum Foo = "A Foo"; public static StringEnum Bar = "A Bar"; public static StringEnum W

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

我试图通过将构造函数设置为私有来阻止任何其他实例的构造。然而,我还希望进行隐式转换,使静态声明更容易/更整洁

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); }
}  
此隐式运算符无法使用修饰符private进行编译。该运算符对此项无效。我可以将其公开,但其他代码可以构造非枚举成员。我也可以去掉静态实例并重新创建,但它看起来更整洁,如上所述

我只是想知道为什么你不能真正拥有私人转换运营商,以及是否有人可以建议一种满足我学究癖好的替代方式?

来自:

至于语言设计者为什么选择要求转换运算符 为了公开……我想他们可能想避免吃得太多 那些操作符的“魔力”在于,他们不需要代码 在一个组件内以一种方式运行,而以一种完全不同的方式运行 在另一个总成内,没有任何明显迹象表明发生了什么 继续

另一种方法是:只需使用Description属性标记enum成员,并使用反射获取“友好”成员名称:

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
}
发件人:

至于语言设计者为什么选择要求转换运算符 为了公开……我想他们可能想避免吃得太多 那些操作符的“魔力”在于,他们不需要代码 在一个组件内以一种方式运行,而以一种完全不同的方式运行 在另一个总成内,没有任何明显迹象表明发生了什么 继续

另一种方法是:只需使用Description属性标记enum成员,并使用反射获取“友好”成员名称:

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
}
只是想知道为什么不能使用私有转换运算符

运算符只是围绕特殊方法的语法糖。在隐式转换的情况下,运算符被编译为如下内容:

public static string op_Implicit(StringEnum s)
{
    // implementation
}
私有方法意味着隐藏实现细节——操作符意味着使类外的代码看起来更干净。私下里,仅仅创建一个方法来进行转换而不是隐式操作符是非常简单的。因此,拥有一个私有操作符没有什么价值,因为它只影响私有接口——它根本不影响公共接口。因此,这种特性的好处并不能证明设计、实现、测试、测试以及更多测试、文档和维护的成本是合理的

是否有人能提出另一种方式来满足我的迂腐

只需将转换设置为私有方法,而不是运算符

只是想知道为什么不能使用私有转换运算符

运算符只是围绕特殊方法的语法糖。在隐式转换的情况下,运算符被编译为如下内容:

public static string op_Implicit(StringEnum s)
{
    // implementation
}
私有方法意味着隐藏实现细节——操作符意味着使类外的代码看起来更干净。私下里,仅仅创建一个方法来进行转换而不是隐式操作符是非常简单的。因此,拥有一个私有操作符没有什么价值,因为它只影响私有接口——它根本不影响公共接口。因此,这种特性的好处并不能证明设计、实现、测试、测试以及更多测试、文档和维护的成本是合理的

是否有人能提出另一种方式来满足我的迂腐


只需将转换设置为私有方法而不是运算符。

为什么名称中需要空格?您是否可以向普通枚举中的每个项添加“显示名称”属性?或者查找以转换为字符串表示形式?您是否在寻找其他原因,而不是因为规范规定所有运算符都必须声明为公共和静态?通常情况下,这些都不会出现。为什么名称中需要空格?您是否可以向普通枚举中的每个项添加“显示名称”属性?或者查找以转换为字符串表示形式?您是否在寻找其他原因,而不是因为规范规定所有运算符都必须声明为公共和静态?通常情况下,这些都不会出现。非常感谢您的回答。不幸的是,我已经忽略了属性,因为它们使用反射,IMO甚至比简单的新StringEnum更混乱。我错过了另一个问题,谢谢你的链接。非常感谢你的回答。不幸的是,我已经忽略了属性,因为它们使用反射,IMO甚至比简单的新StringEnum更混乱。我错过了另一个问题,谢谢你的链接。