Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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#_.net_Language Features_Feature Detection - Fatal编程技术网

为什么C#中不存在枚举扩展?

为什么C#中不存在枚举扩展?,c#,.net,language-features,feature-detection,C#,.net,Language Features,Feature Detection,我认为许多C#开发人员遇到了这样一个问题:standart.net库中有一些枚举,有许多standart类及其使用方法。但如果您想通过添加一些不可能的字段来扩展这个枚举,但它可以有效地简化开发过程,并且不会干扰那些标准类的工作。我用具体的例子来描述它: System.Diagnostics命名空间中有一个枚举TraceOptions,TraceListener使用它。让我们来设计一个带有一些额外选项的监听器(比如AssemblyName等等)。现在,我必须创建一个新的枚举,其中包含我的所有额外选

我认为许多C#开发人员遇到了这样一个问题:standart.net库中有一些枚举,有许多standart类及其使用方法。但如果您想通过添加一些不可能的字段来扩展这个枚举,但它可以有效地简化开发过程,并且不会干扰那些标准类的工作。我用具体的例子来描述它: System.Diagnostics命名空间中有一个枚举TraceOptions,TraceListener使用它。让我们来设计一个带有一些额外选项的监听器(比如AssemblyName等等)。现在,我必须创建一个新的枚举,其中包含我的所有额外选项,这些选项补充了TraceOptions枚举中的选项。然后向我的侦听器添加新属性extraceOptions。但如果我能写下这样的东西呢:

enum MyExtraEnum : TraceOptions
{
  AssemblyName = 128
}
MyExtraEnum将通过新字段扩展TraceOptions,这些字段不能与TraceOptions的字段相交,也不能通过名称或值。然后我可以将TraceOptions与新字段一起使用,如:

     TraceOptions t = TraceOptions.AssemblyName; (IntelliSense may display that this 
field is extended field from MyExtraEnum enumeration)
我知道这可能会使用TraceOptions enum损坏现有代码,但如果我确信这不会发生,并且使用这些功能的所有责任都在我身上的话


您如何处理这种情况?

您不能从枚举继承,所有枚举都是隐式密封的。因此,没有简单的方法向枚举添加额外的值(如果您正试图这样做的话)。您必须定义一个新的枚举


如果要向枚举添加额外的方法,可以使用扩展方法,但这是扩展它们的唯一方法。

不能从枚举继承,所有枚举都是隐式密封的。因此,没有简单的方法向枚举添加额外的值(如果您正试图这样做的话)。您必须定义一个新的枚举


如果要向枚举添加额外的方法,可以使用扩展方法,但这是扩展它们的唯一方法。

我觉得这不是个好主意。所以现在C#6退出了,
TraceOptions
有一个新特性:
SomeFoo=128
。或者可能是一个
AssemblyName=127
。现在出现了一个冲突,
TraceOptions
的提供者不希望发生冲突(与常规子类化不同)


枚举提供了一组有限的选项,枚举的作者支持这些选项。说你承担全部责任是不够的。这就像要求所有成员变量都是公共的,声明永远不会滥用它们。这不是一种安全的编程方法。

我觉得这不是一个好主意。所以现在C#6退出了,
TraceOptions
有一个新特性:
SomeFoo=128
。或者可能是一个
AssemblyName=127
。现在出现了一个冲突,
TraceOptions
的提供者不希望发生冲突(与常规子类化不同)


枚举提供了一组有限的选项,枚举的作者支持这些选项。说你承担全部责任是不够的。这就像要求所有成员变量都是公共的,声明永远不会滥用它们。这不是一种安全的编程方法。

这种分类违背了枚举的目的。这种分类违背了枚举的目的。但这种情况可能发生在所有扩展方法上,不仅仅是在枚举上…@JoanCharmant,这一点很好,但在值部分仍然有很大的不同。如果枚举使用值1-9,则扩展和下一版本的枚举都可能使用值10。名称冲突的可能性要低得多,这是扩展方法的唯一问题。但这可能发生在所有扩展方法上,不仅仅是在枚举上…@JoanCharmant,说得好,但在值部分仍然有很大的不同。如果枚举使用值1-9,则扩展和下一版本的枚举都可能使用值10。名称冲突的可能性要低得多,这是扩展方法的唯一问题。