2009-09-15 22 views
5

enumの重複キーがコンパイルされないようにする方法はありますか?このコード列挙型の値が重複しないようにする方法は?

Console.WriteLine(EDuplicates.Unique); 
Console.WriteLine(EDuplicates.Duplicate); 
Console.WriteLine(EDuplicates.Keys); 
Console.WriteLine(EDuplicates.Compilation); 

Duplicate 
Duplicate 
Keys 
Keys 
+1

ああは、Javaの列挙型の喜び。 :) – cletus

+1

これはC#です。 :-) –

+0

なぜ 'Console.WriteLine(EDuplicates.Unique);'が 'Duplicate'を出力するのかを知るには、次のリンクを参照してください:http://stackoverflow.com/questions/530281/unexpected-result-when-using-enum-parse –

答えて

14

これを印刷しますが、以下に、このenum

public enum EDuplicates 
{ 
    Unique, 
    Duplicate = 0, 
    Keys = 1, 
    Compilation = 1 
} 

をコンパイルします。たとえば

ので任意の準拠、言語仕様によって禁止されていませんC#コンパイラ それを許可します。 Monoコンパイラは常にそれを禁止するように適応できますが、単なる列挙型のアセンブリをスキャンしてそのように実施する単体テストを書く方が簡単です。

+2

私はおそらくここでポイントを見逃しているでしょう:これをサポートするための有用なシナリオは何ですか?便利なシナリオがない場合、なぜコンパイラに状況を処理させるために、これに対してユニットテストを書くのが好きですか? –

+0

@Brian:既存のコードが壊れないようにする。下位互換性は、仕様に準拠しているので重要です。私はただちに有用なシナリオを考えることはできませんが、それはすでにこれを使用している人を壊すことを望むわけではありません。 –

+6

@Brian:何らかの理由で古いコードを壊さずに列挙型の名前を変更したい場合に便利です:新しい名前と古いものと同じ数値を持つ新しい値を追加し、古い値を飾ります'Obsolete'属性で置き換えます。 –

0
public bool ValidateAllDistinct(Type enumType) 
{ 
    return !Enum.GetNames(enumType).All(outerName 
     => Enum.GetNames(enumType).Any(innerName 
      => innerName == outerName 
       ? true 
       : Enum.Parse(enumType, innerName) != Enum.Parse(enumType, outerName))); 
} 

私は単体テストの簡単なテスト方法です。

+0

これは私が書いた単体テストのようなもので、私は重複するキーを印刷するという違いがあります。 – zzandy

+0

[this](https://dotnetfiddle.net/0KoChn)に合格すると動作しません。私が何かを見逃したら私を修正してください。 – LosManos

9

ここで、それをチェックする簡単なユニットテストだ少し速くする必要があります:

[TestMethod] 
public void Test() 
{ 
    var enums = (myEnum[])Enum.GetValues(typeof(myEnum)); 
    Assert.IsTrue(enums.Count() == enums.Distinct().Count()); 
}