2010-11-22 94 views
6

下午好,在C#鑄造,讓我們說我有枚舉使用整數枚舉不

public enum Test : int 
{ 
    TestValue1 = 0, 
    TestValue2, 
    TestValue3 
} 

爲什麼我不能使用像Int32 IntTest = Test.TestValue1語句不進行強制轉換意味着IntTest = 0?如果我稍後決定向枚舉中添加更多項目,這將會非常有用。我想我不得不使用Int32 IntTest = (Int32) Test.TestValue1,我認爲應該是多餘的......還有,爲什麼我不能讓像

switch (IntTest) 
{ 
    case (Test.TestValue1) : DoSomething(); 
          break; 
    case (Test.TestValue2) : DoSomethingElse(); 
          break; 
    default    : Do Nothing(); 
} 

?編譯器說,它期望在TestValue1的地方有一個恆定的值......這個值是不是恆定的?

非常感謝。

+3

不應該是'case(Test.TestValue1)''而不是'case(TestValue1)'嗎?你想與枚舉進行比較,對吧? – 2010-11-22 15:44:39

回答

8

請注意,你可以這樣做:

switch ((Test)IntTest) 
{ 
    case (Test.TestValue1) : DoSomething(); 
          break; 
    case (Test.TestValue2) : DoSomethingElse(); 
          break; 
    default    : DoNothing(); 
} 

演員從int測試保證不會失敗,即使該值不在枚舉中。如果該值不在枚舉中,則在Test實例上調用ToString()將返回基礎數值的字符串表示形式。

3

您必須投射,因爲語言定義說您必須投射。冗餘?也許。但事情就是這樣。

爲了您switch聲明:

switch (IntTest) 
{ 
    case (int)Test.TestValue1: DoSomething(); break; 
} 

枚舉值必須與該枚舉類型的名稱完全合格。

5

您不能交替使用Int32Test,因爲它們在語義上是不同的類型,即使它們碰巧使用相同的底層存儲機制。

如果您需要Int32,請使用Int32;如果您需要Test,請使用Test;如果您需要在它們之間進行轉換,則使用明確的轉換。

(當然,語言很容易被只具備讓這些隱式轉換,但這樣的「功能」可能會帶來更多的問題比它解決的。)

0
  • 首先,您的枚舉的: int部分是完全多餘的,因爲int是enum的默認管理類型。

  • 需要強制轉換,因爲當你編寫一個枚舉時,你實際上定義了一個新的Type,很像一個類。名爲Test的枚舉值的類型爲Test

1

枚舉的工作原理是,通過設計
作爲MSDN說:

的基本類型指定 存儲多少分配給每個 枚舉。但是,顯式轉換 對於將枚舉類型 轉換爲整數類型是必要的。

1

嘿嘿,我剛剛在我的書中讀過這章。

第一件事,我想提一提你正在嘗試這種

Console.WriteLine(Test.TestValue1); 

你會發現一些東西。

輸出不是數字,甚至不是整數。

此外,這也應該回答你的第二個問題。

所以你必須明確地將你的枚舉轉換爲整數。

:)

1

正如保羅指出你應該可以解決(你顯然已經固定)語法錯誤。正如其他人指出的那樣測試是一個枚舉值,它保存一個整數的值。舉例來說,枚舉可以輕鬆處理像x0001或0xA0BC(41148)這樣的值。

在您使用的示例中Int32 IntTest這是一個32位整數;我可能會添加你應該使用int而不是int32除非你的枚舉持有一些其他的一個整數甚至不指定:int因爲默認的持有類型確實是整數。

關於編譯器迫使你處理該值的原因;它只是如何工作,枚舉不是一個整數,只有其可能的子屬性(TestValue1,TestValue2,TestValue3)的值是整數。 *

正如有人指出的是什麼將在Console.WriteLine打印不是整數*

2

我想以與此相同的方式實現枚舉,以簡化將使用表列名作爲字符串的應用程序轉換爲索引的過程。

這就是我想要實現:

enum TableName 
{ 
    Column1Name = 0 
} 

Column1Data = (cast)objData[RowIndex][TableName.Column1Name]; 

如上面提到的是,C#中使用枚舉的

Column1Data = (cast)objData[RowIndex][(int)TableName.Column1Name]; //what a waste of time.. 

時需要顯式轉換的麻煩,但我有一個解決辦法..呻吟所有你想要的:P(這不是一個生產應用程序 - 請仔細想一想這段代碼的影響,在實際環境中實現它之前)

public static class TableName 
{ 
    public const int Column1Name = 0; 
} 

Column1Data = (cast)objData[RowIndex][TableName.Column1Name]; //this is now valid, and my sanity remains intact - as does the integer value ;) 
1
public enum Test 
{ 
    TestValue1 = 0, 
    TestValue2, 
    TestValue3 
} 

在一個方法,你可以使用枚舉作爲一種。
只需打開一個類型爲Test的變量,那麼您就不需要將枚舉強制轉換爲int類型。

public void DoSwitch(Test val) 
{ 
    switch (val) 
    { 
     case (Test.TestValue1) : DoSomething(); 
           break; 
     case (Test.TestValue2) : DoSomethingElse(); 
           break; 
     default    : Do Nothing(); 
    } 
}