2011-10-07 49 views
7

提前道歉,因爲我確信有人以前一定問過這個問題,但我找不到它。Enums,overlapping values,C#

剛剛有一個驚喜,我和一個同事爲enum增加了相同的值,並且它編譯了,例如,

enum MyEnum 
    { 
    mine = 1, 
    his = 1 
    } 

看起來像C/C++支持這也(?)。任何這種行爲的原因,任何情況下,它是有用的?我看到一個案例有區別人類語言(一個= 1,EINS = 1等),但我不相信

感謝

+0

所以,也許你能做到這一點'枚舉MyEnum { [作廢]礦= 1, 他= 1 }' – V4Vendetta

+0

據推測,如果你正在價值觀明確你*護理*什麼,這些價值觀是,所以這種衝突不應該發生。如果你不關心每個成員代表什麼價值,你可以不讓他們明確,不會發生衝突。 –

回答

8

讓我們舉一個簡單的例子

enum PrivilegeLevel 
{ 
    None, 
    Reporter, 
    Reviewer, 
    Admin, 
    DefaultForNewUser = None, 
    DefaultForProjectOwner = Reviewer, 
}; 
+0

由於常量的二進制版本化語義,這聽起來像一個壞主意。 – CodesInChaos

+0

你是什麼意思版本化常量的語義? – crazyjul

+0

@crazyjul常量不能版本化。如果你改變一個常量(見,這是一個矛盾),所有使用它的程序集現在都被破壞了,因爲它們仍然使用舊的值。你不會改變pi的價值,你會嗎?但是您可能想要更改默認特權級別。 –

0

的想法枚舉類型的後面是創建新的數據類型,這些數據類型只能使用限制範圍的值。

你所做的是合法的,編譯器不應該給任何錯誤,因爲枚舉只是一個常量。你只是給你一個合乎邏輯的名字。

當需要分隔命名常量時,可以將相同的值分配給兩個或更多枚舉常量。假設你有一個配色方案,它們都使用相同的基本顏色,但是方案需要在邏輯上分開。然後你可以使用枚舉常量的相同值。但仍然有更好的方法來做到這一點。

+1

「如果將相同的值賦給兩個或更多枚舉常量,枚舉的整個用途就會減少。」我不同意。枚舉的全部目的是讓你使用名字而不是幻數。我看不出具有相同幻數的兩個名字是不好的。 –

+0

@ R.MartinhoFernandes:我全心全意地同意你的不同意見。有時候別名是好事。 –

+0

我想這不會比C++ typedef更糟糕,只是在當時感到驚訝 – tony