添加枚举值是否会破坏二进制兼容性?

时间:2012-10-03 20:01:13

标签: c# enums binary-compatibility

想象一下DLL中的这个枚举。

public enum Colors
{
    Red,
    Green
}

添加枚举值是否会破坏二进制兼容性?如果我要改变它,现有的EXE会破坏吗?

public enum Colors
{
    Red,
    Green,
    Blue
}

我看到了this answer,但它似乎解决了插入值的问题。如果我将值添加到仅限结束,那可以吗?

2 个答案:

答案 0 :(得分:17)

不,这不会破坏二进制兼容性(因为:程序集仍会加载等),因为枚举基本上是整数文字常量。在中间插入值显然是一个非常危险的想法,但你已经排除了它。

但是,它可能会导致您需要防范的其他一些问题:

  • 某些代码(特别是switch语句)可能无法预测新值;从技术上讲,这也是一个问题,因为枚举没有经过值检查(枚举变量可以包含未定义的值)
  • 查询可用枚举的任何内容都会得到不同的结果
    • 特别是,如果存在使用特定客户端尚未预期的枚举的数据,则序列化和反序列化可能会意外失败

答案 1 :(得分:3)

应该没问题,假设你只追加到最后。但是,破坏的风险来自于从0开始隐式定义枚举值的事实。因此,如果有人将值保存到数据库,则可能会更改它们映射到的值。

例如,如果您将枚举更改为:

public enum Colors
{
    Blue,
    Red,
    Green
}

任何将这些值存储在他们的数据库中的人都会看到曾经是红色的东西,现在是蓝色的,绿色的东西现在是红色的。

理想情况下,您应该像这样定义枚举:

public enum Colors
{
    Red = 0,
    Green = 1
}

然后,当你添加一个新的时,你应该:

public enum Colors
{
    Red = 0,
    Green = 1,
    Blue = 2
}

这有助于防止任何潜在的版本问题。