2016-06-10 220 views
-1

爲什麼在以下示例中枚舉已經是uint時必須轉換爲uint? : uint也會改變什麼嗎?如果我刪除它,我會得到相同的錯誤。 args.Progress是一個uint。將枚舉轉換爲uint

switch (args.Progress) 
{ 
    case (uint) Values.value1: // works 
     break; 
    case Values.value2: // error 
     break; 
} 

public enum Values : uint 
{ 
    value1, 
    value2 
}; 
+0

args.Progress是一個uint大概嗎? –

+1

好吧,你也可以投入args.Progress到'Values';)'switch((Values)args.Progress)' –

+0

@BenJackson是的,我添加了信息 – Nfear

回答

5

規範: uint不會使它的uint。它只定義每個成員的類型,但enum仍然是enum

由枚舉型定義,如:

public enum Foo : uint 
{ 
    MemberA, 
    MemberB 
} 

編譯器(或多或少)創建與常量

public class Foo 
{ 
    public const uint MemberA = 0; 

    public const uint MemberB = 1; 
} 

之所以類指定: long或任何東西是要確保你的價值觀匹配在那裏,它正確地映射到任何你試圖將它轉換成的變量。使用C代碼的DllImport時,將其映射到來自頭文件的常量值也很重要。

2

TL;博士:Valuesuint不一樣,但它的敞篷明確。

switch要求兩個值(切換的值以及與之比較的值)具有相同類型(或至少隱式可轉換)。您不能將枚舉值隱式轉換爲相應的整型(反之亦然)。出於同樣的原因,你不能將積分值賦給一個枚舉類型的變量:

enum Foo { Spam = 1, Egg = 2, Bar = 4 } 

Foo test = 1; 

這會導致編譯時異常:

錯誤CS0266:無法隱式轉換類型「詮釋」到「富」。存在明確的轉換(您是否缺少演員?)

可以能做的就是值轉換成其他類型的內容:

Foo test = (Foo)1; 
int test2 = (int)Foo.Egg; 

這同樣適用於比較:

if(test == 1) { Console.WriteLine("It's 1!"); } 

錯誤CS0019:運算符「= ='不能應用於'Foo'和'int'類型的操作數

if(test2 == Foo.Egg) { Console.WriteLine("It's an egg!"); } 

錯誤CS0019:操作員「==」不能被施加到型「INT」的操作數和「富」

然而,鑄造中的一個值的類型中的另一個,它就像一個魅力:

if((int)test == 1) { Console.WriteLine("It's 1!"); } 
if(test == (Foo)1) { Console.WriteLine("It's 1!"); } 
if((Foo)test2 == Foo.Egg) { Console.WriteLine("It's an egg!"); } 
if(test2 == (int)Foo.Egg) { Console.WriteLine("It's an egg!"); } 

這是1!

這是1!

這是一個雞蛋!

這是一個雞蛋!