2010-06-24 95 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 

此外,由于一些人所指出的,它可能是一个好主意为所有枚举值分配值,以便与中间值相加的枚举值相关的整数值不会更改。如果将这些值写入数据库或文件,这可能会有所帮助。