2

EDI フィールド用の大きな Enum クラスがあります。簡単な例を示すと、列挙型は次のように宣言されます。

[Description("Ebene")]
Ebene,

[Description("Zaehlpunktdaten")]
Zaehlpunktdaten,

[Description("Zaehlpunkt")]
Zaehlpunkt,

. .

列挙型は で取得すると正常に動作しますEDIEnums.Zaehlpunktdaten.ToString()が、他のプロジェクトでは間違った値を返します。

最初に新しいものを追加すると、次のものを正確に返します。この例では、追加したばかりEbeneで取得したい場合Zaehlpunktdaten、 me が返されます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 の値を参照していますが、現在は ではありませXY。これが表示されているエラーです。これが、新しい列挙値の追加が破壊的変更と見なされる理由です。

列挙が変更されることが予想される場合は、アセンブリ B をコンパイルする前に、暗黙的な番号付けを使用するのではなく、自分で列挙値に番号を付けておく必要があります。

次の 2 つのオプションがあります。

  1. 可能な回避策は、列挙の最後に新しい値を追加して、インデックスのシフトを回避することです。しかし、これはずさんな回避策です。
  2. ここで列挙値に番号を付けることを検討し、そのアセンブリに応じてプロジェクトを再構築してくださいアセンブリ A に依存するプロジェクトの数によっては、大変な作業のように見えるかもしれませんが、あなたと同僚が将来同じ問題に遭遇するのを防ぐことができます。
于 2014-05-14T15:03:54.860 に答える