Использование значений Enum как целых - PullRequest
1 голос
/ 24 июня 2010

У меня есть следующий перечислимый тип:

        /// <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 в приведенной выше строке кода.Разве значение по умолчанию для перечисления не является целым числом?

Ответы [ 5 ]

4 голосов
/ 24 июня 2010

Вы можете привести тип enum так же, как и к 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 голос
/ 24 июня 2010

Да, вы можете привести значение enum к целому числу. Если E_LAST только для информационных целей, вы можете посмотреть на что-то подобное.

string numberOfElements = Enum.GetNames( typeof( E_TTE_NODES ) ).Length;
List<Int32> transmitIndex = new List<Int32>( numberOfElements );
1 голос
/ 24 июня 2010

Это должно быть хорошо. Например, это компилируется без проблем:

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 голосов
/ 24 июня 2010

Если вы пытаетесь получить общее количество элементов в этом Enum, вы можете попробовать использовать:

Enum.GetValues(typeof(E_TTE_NODES)).Length

Кроме того, как отметили некоторые другие, вероятно, это хорошая идея назначитьзначения для всех ваших значений перечисления, так что целочисленные значения, связанные со значениями перечисления, не изменятся, если что-то будет добавлено в середину.Это может иметь значение, если вы записываете эти значения в базу данных или файл.

0 голосов
/ 24 июня 2010

Это работает. Следующие компиляции отлично:

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, если вы собираетесь это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...