2010-06-24 69 views
1

我有以下枚舉類型:使用枚舉值作爲整數

 /// <summary> 
     /// TTE Node types. 
     /// </summary> 
     public enum E_TTE_NODES 
     { 
      /// <summary> 
      /// Represents FCM 0 
      /// </summary> 
      E_FCM0 = 0, 

      /// <summary> 
      /// Represents FCM 1 
      /// </summary> 
      E_FCM1, 

      /// <summary> 
      /// Represents FCM 2 
      /// </summary> 
      E_FCM2, 

      /// <summary> 
      /// Represents DCM 0 
      /// </summary> 
      E_DCM0, 

      /// <summary> 
      /// Represents DCM 1 
      /// </summary> 
      E_DCM1, 

      /// <summary> 
      /// Represents DCM 2 
      /// </summary> 
      E_DCM2, 

      /// <summary> 
      /// Represents CCM 0 
      /// </summary> 
      E_CCM0, 

      /// <summary> 
      /// Represents CCM 1 
      /// </summary> 
      E_CCM1, 

      /// <summary> 
      /// Represents CCM 2 
      /// </summary> 
      E_CCM2, 

      /// <summary> 
      /// Represents PDU C1 
      /// </summary> 
      E_PDU_C1, 

      /// <summary> 
      /// Represents the last node. 
      /// Must remain last. 
      /// </summary> 
      E_LAST,   
     } 

我想初始化一個泛型列表如下:

// Should initialize to a capacity of 10 
private List<Int32> transmitIndex = new List<Int32>((Int32)E_TTE_NODES.E_LAST); 

是的,我知道我可以只通過數10作爲參數。枚舉可能會在未來添加更多節點,但E_LAST將始終是最後一個節點。我的問題是我的編譯器說,我不能在上面的代碼行中將枚舉強制轉換爲int。不是枚舉值的默認值是整數嗎?

+0

你究竟在做什麼? – Grzenio 2010-06-24 16:26:13

+0

你會得到什麼錯誤? – Grzenio 2010-06-24 16:27:48

+0

我得到的錯誤是「無法將類型'TTEProject.E_TTE_NODES'轉換爲'int'」 – Blade3 2010-06-24 16:29:07

回答

4

您可以將一個枚舉類型轉換爲int類型,問題可能在其他地方。

這將產生你所說的編譯錯誤:

private List<Int32> transmitIndex = new List<Int32>(E_TTE_NODES.E_LAST); 

這不會:

private List<Int32> transmitIndex = new List<Int32>((Int32)E_TTE_NODES.E_LAST); 
1

這應該是罰款。例如,這沒有問題編譯:

using System; 
using System.Collections.Generic; 

enum Foo 
{ 
    Bar = 0, 
    Baz 
} 

public class Test 
{ 
    static void Main() 
    { 
     List<Int32> transmitIndex = new List<Int32>((Int32)Foo.Baz); 
    } 
} 

你可以發佈一個類似的簡短但完整的程序,無法編譯?你可能會錯過using System;

0

這是行不通的。以下編譯罰款:

using System; 
using System.Collections.Generic; 

/// <summary> 
/// TTE Node types. 
/// </summary> 
public enum E_TTE_NODES 
{ 
    /// <summary> 
    /// Represents FCM 0 
    /// </summary> 
    E_FCM0 = 0, 

    /// <summary> 
    /// Represents FCM 1 
    /// </summary> 
    E_FCM1, 

    /// <summary> 
    /// Represents FCM 2 
    /// </summary> 
    E_FCM2, 

    /// <summary> 
    /// Represents DCM 0 
    /// </summary> 
    E_DCM0, 

    /// <summary> 
    /// Represents DCM 1 
    /// </summary> 
    E_DCM1, 

    /// <summary> 
    /// Represents DCM 2 
    /// </summary> 
    E_DCM2, 

    /// <summary> 
    /// Represents CCM 0 
    /// </summary> 
    E_CCM0, 

    /// <summary> 
    /// Represents CCM 1 
    /// </summary> 
    E_CCM1, 

    /// <summary> 
    /// Represents CCM 2 
    /// </summary> 
    E_CCM2, 

    /// <summary> 
    /// Represents PDU C1 
    /// </summary> 
    E_PDU_C1, 

    /// <summary> 
    /// Represents the last node. 
    /// Must remain last. 
    /// </summary> 
    E_LAST, 
} 

public class Example 
{ 
    private List<Int32> transmitIndex = new List<Int32>((Int32) E_TTE_NODES.E_LAST); 

    public static void Main() 
    { 
     Example example = new Example(); 
     Console.WriteLine(example.transmitIndex.Capacity); 

     Console.ReadKey(); 
    } 
} 

這將按預期在運行時打印「10」。

這就是說,如果你打算這麼做,我強烈建議爲所有的枚舉值賦值,而不僅僅是E_FCM0。

1

是的,你可以將一個枚舉值轉換爲整數。如果E_LAST僅僅是爲了信息目的,你可以看看做這樣的事情。

string numberOfElements = Enum.GetNames(typeof(E_TTE_NODES)).Length; 
List<Int32> transmitIndex = new List<Int32>(numberOfElements); 
+1

這將允許這些值成爲他們想要的任何東西,並且不需要以任何特定的順序。缺點是這會使用比將E_LAST強制轉換爲int更慢的反射。 – 2010-06-24 16:36:47

0

如果你想進入這個枚舉的項目總數,你可能想使用嘗試:

Enum.GetValues(typeof(E_TTE_NODES)).Length 

此外,由於一些人所指出的,它可能是一個好主意爲所有枚舉值分配值,以便與中間值相加的枚舉值相關的整數值不會更改。如果將這些值寫入數據庫或文件,這可能會有所幫助。