2

我们有一个用于 EDI 字段的大型 Enum 类,举个简短的例子,枚举声明如下:

[Description("Ebene")]
Ebene,

[Description("Zaehlpunktdaten")]
Zaehlpunktdaten,

[Description("Zaehlpunkt")]
Zaehlpunkt,

. .

好吧,当您通过 检索枚举时,枚举工作正常EDIEnums.Zaehlpunktdaten.ToString(),但在其他一些项目中,它返回错误的值。

如果我在开头添加一个新的将返回下一个,在这个例子中,如果我刚刚添加Ebene并且我想检索Zaehlpunktdaten,它将返回我Zaehlpunkt

我们也尝试过=0, =1,=2,但它也不起作用。也有当地的参考资料。

关于正在发生的事情有什么想法吗?

4

1 回答 1

1

假设程序集 A 定义了MyEnum. 默认情况下,每个枚举值都被隐式分配一个整数“索引”,如下所示:

public enum MyEnum
{
    X = 1,
    Y = 2,
    Z = 3
}

如果程序集 B 中的源代码使用MyEnum.Y,则该代码将针对索引 2 处的值进行编译。

如果您现在在开头添加一个新项目,则索引将发生变化:

public enum MyEnum
{
    New = 1,
    X = 2,
    Y = 3,
    Z = 4
}

程序集 B 仍然引用索引 2 处的值,现在它X不是Y. 这是您看到的错误。这就是为什么添加新的枚举值被认为是一项重大更改。

如果您希望枚举发生变化,您应该在编译程序集 B之前自己对枚举值进行编号,而不是使用隐式编号。

您现在有两个选择:

  1. 一种可能的解决方法是在枚举末尾添加新值,以避免移动索引。但这是一个草率的解决方法。
  2. 现在考虑对枚举值进行编号,根据该程序集重建任何项目。这可能看起来需要做很多工作,具体取决于有多少项目依赖于程序集 A,但它可以避免您和您的同事在未来再次遇到同样的问题。
于 2014-05-14T15:03:54.860 回答