c # перечисление длинных значений - PullRequest
17 голосов
/ 17 августа 2011

Мне было интересно, почему эта декларация:

public enum ECountry : long
{
    None,
    Canada,
    UnitedStates
}

требуется приведение для любого из его значений?

long ID = ECountry.Canada;
// Error Cannot implicitly convert type 'ECountry' to 'long'.
// An explicit conversion exists (are you missing a cast?)

И есть ли способ получить длинное значение непосредственно из перечисления, кроме приведения?

Это не будет работать, например:

public enum ECountry : long
{
    None = 0L,
    Canada = 1L,
    UnitedStates=2L
}

Ответы [ 5 ]

29 голосов
/ 17 августа 2011

Проблема , а не в том, что базовый тип по-прежнему int.Это long, и вы можете назначить long значения для членов.Однако вы можете никогда просто присвоить значение enum целочисленному типу без приведения.Это должно работать:

public enum ECountry : long
{
    None,
    Canada,
    UnitedStates = (long)int.MaxValue + 1;
}

// val will be equal to the *long* value int.MaxValue + 1
long val = (long)ECountry.UnitedStates;
7 голосов
/ 17 августа 2011

Тип по умолчанию enum - int. enum может быть любым целым типом, кроме char.

Если вы хотите, чтобы оно было long, вы можете сделать что-то вроде этого:

// Using long enumerators
using System;
public class EnumTest 
{
    enum Range :long {Max = 2147483648L, Min = 255L};
    static void Main() 
    {
        long x = (long)Range.Max;
        long y = (long)Range.Min;
        Console.WriteLine("Max = {0}", x);
        Console.WriteLine("Min = {0}", y);
    }
}

Здесь важен актерский состав. И, как говорит @dlev, цель использования long в enum - поддерживать большое количество флагов (более 32, поскольку 2 ^ 32 равно 4294967296, а long может содержать более 2 ^ 32).

5 голосов
/ 17 августа 2011

Вы должны разыграть перечисление, чтобы получить из него значение, или оно останется enum типа

2 голосов
/ 17 августа 2011

Из MSDN

В этом примере опция base-type используется для объявления перечисления, члены которого имеют тип long. Обратите внимание, что, хотя базовый тип перечисления является длинным, члены перечисления должны быть явно преобразованы в тип long с использованием приведения.

// keyword_enum2.cs
// Using long enumerators
using System;
public class EnumTest 
{
    enum Range :long {Max = 2147483648L, Min = 255L};
    static void Main() 
    {
        long x = (long)Range.Max;
        long y = (long)Range.Min;
        Console.WriteLine("Max = {0}", x);
        Console.WriteLine("Min = {0}", y);
    }
}

Выход

Макс = 2147483648 Мин = 255

1 голос
/ 17 августа 2011

AFAIK, вы должны привести.

Статья MSDN гласит: «Однако для преобразования из перечисляемого типа в целочисленный тип требуется явное приведение» (int или long)

Youможете проверить это: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/enum

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