EnumsEnums

Um tipo de enumeração é um tipo de valor distinto (tipos de valor) que declara um conjunto de constantes nomeadas.An enum type is a distinct value type (Value types) that declares a set of named constants.

O exemploThe example

enum Color
{
    Red,
    Green,
    Blue
}

declara um tipo de enumeração chamado Color com membros Red, Greene Blue.declares an enum type named Color with members Red, Green, and Blue.

Enumerar declaraçõesEnum declarations

Uma declaração enum declara um novo tipo enum.An enum declaration declares a new enum type. Uma declaração enum começa com a palavra-chave enume define o nome, a acessibilidade, o tipo subjacente e os membros da enumeração.An enum declaration begins with the keyword enum, and defines the name, accessibility, underlying type, and members of the enum.

enum_declaration
    : attributes? enum_modifier* 'enum' identifier enum_base? enum_body ';'?
    ;

enum_base
    : ':' integral_type
    ;

enum_body
    : '{' enum_member_declarations? '}'
    | '{' enum_member_declarations ',' '}'
    ;

Cada tipo de enumeração tem um tipo integral correspondente chamado de tipo subjacente do tipo de enumeração.Each enum type has a corresponding integral type called the underlying type of the enum type. Esse tipo subjacente deve ser capaz de representar todos os valores de enumerador definidos na enumeração.This underlying type must be able to represent all the enumerator values defined in the enumeration. Uma declaração de enumeração pode declarar explicitamente um tipo subjacente de byte, sbyte, short, ushort, int, uint, long ou ulong.An enum declaration may explicitly declare an underlying type of byte, sbyte, short, ushort, int, uint, long or ulong. Observe que char não pode ser usado como um tipo subjacente.Note that char cannot be used as an underlying type. Uma declaração de enumeração que não declara explicitamente um tipo subjacente tem um tipo subjacente de int.An enum declaration that does not explicitly declare an underlying type has an underlying type of int.

O exemploThe example

enum Color: long
{
    Red,
    Green,
    Blue
}

declara um enum com um tipo subjacente de long.declares an enum with an underlying type of long. Um desenvolvedor pode optar por usar um tipo subjacente de long, como no exemplo, para habilitar o uso de valores que estão no intervalo de long, mas não no intervalo de int, ou para preservar essa opção para o futuro.A developer might choose to use an underlying type of long, as in the example, to enable the use of values that are in the range of long but not in the range of int, or to preserve this option for the future.

Modificadores de enumeraçãoEnum modifiers

Um enum_declaration pode, opcionalmente, incluir uma sequência de modificadores de enumeração:An enum_declaration may optionally include a sequence of enum modifiers:

enum_modifier
    : 'new'
    | 'public'
    | 'protected'
    | 'internal'
    | 'private'
    ;

É um erro de tempo de compilação para o mesmo modificador aparecer várias vezes em uma declaração de enumeração.It is a compile-time error for the same modifier to appear multiple times in an enum declaration.

Os modificadores de uma declaração enum têm o mesmo significado que os de uma declaração de classe (modificadores de classe).The modifiers of an enum declaration have the same meaning as those of a class declaration (Class modifiers). Observe, no entanto, que os modificadores abstract e sealed não são permitidos em uma declaração enum.Note, however, that the abstract and sealed modifiers are not permitted in an enum declaration. Enums não podem ser abstract e não permitem derivação.Enums cannot be abstract and do not permit derivation.

Membros de enumeraçãoEnum members

O corpo de uma declaração de tipo enum define zero ou mais membros enum, que são as constantes nomeadas do tipo enum.The body of an enum type declaration defines zero or more enum members, which are the named constants of the enum type. Dois membros enum não podem ter o mesmo nome.No two enum members can have the same name.

enum_member_declarations
    : enum_member_declaration (',' enum_member_declaration)*
    ;

enum_member_declaration
    : attributes? identifier ('=' constant_expression)?
    ;

Cada membro enum tem um valor constante associado.Each enum member has an associated constant value. O tipo desse valor é o tipo subjacente para a enumeração que o contém.The type of this value is the underlying type for the containing enum. O valor constante para cada membro de enumeração deve estar no intervalo do tipo subjacente para a enumeração.The constant value for each enum member must be in the range of the underlying type for the enum. O exemploThe example

enum Color: uint
{
    Red = -1,
    Green = -2,
    Blue = -3
}

resulta em um erro de tempo de compilação porque os valores constantes -1, -2e -3 não estão no intervalo do tipo integral subjacente uint.results in a compile-time error because the constant values -1, -2, and -3 are not in the range of the underlying integral type uint.

Vários membros enum podem compartilhar o mesmo valor associado.Multiple enum members may share the same associated value. O exemploThe example

enum Color 
{
    Red,
    Green,
    Blue,

    Max = Blue
}

mostra uma enumeração na qual dois membros de enum--Blue e Max--têm o mesmo valor associado.shows an enum in which two enum members -- Blue and Max -- have the same associated value.

O valor associado de um membro enum é atribuído implicitamente ou explicitamente.The associated value of an enum member is assigned either implicitly or explicitly. Se a declaração do membro enum tiver um inicializador constant_expression , o valor dessa expressão constante, implicitamente convertido no tipo subjacente da enumeração, será o valor associado do membro enum.If the declaration of the enum member has a constant_expression initializer, the value of that constant expression, implicitly converted to the underlying type of the enum, is the associated value of the enum member. Se a declaração do membro enum não tiver nenhum inicializador, seu valor associado será definido implicitamente, da seguinte maneira:If the declaration of the enum member has no initializer, its associated value is set implicitly, as follows:

  • Se o membro enum for o primeiro membro enum declarado no tipo enum, seu valor associado será zero.If the enum member is the first enum member declared in the enum type, its associated value is zero.
  • Caso contrário, o valor associado do membro de enumeração será obtido aumentando o valor associado do membro de enumeração textualmente anterior por um.Otherwise, the associated value of the enum member is obtained by increasing the associated value of the textually preceding enum member by one. Esse valor maior deve estar dentro do intervalo de valores que podem ser representados pelo tipo subjacente. caso contrário, ocorrerá um erro de tempo de compilação.This increased value must be within the range of values that can be represented by the underlying type, otherwise a compile-time error occurs.

O exemploThe example

using System;

enum Color
{
    Red,
    Green = 10,
    Blue
}

class Test
{
    static void Main() {
        Console.WriteLine(StringFromColor(Color.Red));
        Console.WriteLine(StringFromColor(Color.Green));
        Console.WriteLine(StringFromColor(Color.Blue));
    }

    static string StringFromColor(Color c) {
        switch (c) {
            case Color.Red: 
                return String.Format("Red = {0}", (int) c);

            case Color.Green:
                return String.Format("Green = {0}", (int) c);

            case Color.Blue:
                return String.Format("Blue = {0}", (int) c);

            default:
                return "Invalid color";
        }
    }
}

imprime os nomes de membro de enumeração e seus valores associados.prints out the enum member names and their associated values. A saída é:The output is:

Red = 0
Green = 10
Blue = 11

pelos seguintes motivos:for the following reasons:

  • o membro de enumeração Red é atribuído automaticamente ao valor zero (já que ele não tem nenhum inicializador e é o primeiro membro de enumeração);the enum member Red is automatically assigned the value zero (since it has no initializer and is the first enum member);
  • o membro de enumeração Green recebe explicitamente o valor 10;the enum member Green is explicitly given the value 10;
  • e o membro de enumeração Blue é atribuído automaticamente ao valor um maior que o membro que o precede de uma vez.and the enum member Blue is automatically assigned the value one greater than the member that textually precedes it.

O valor associado de um membro enum pode não ser, direta ou indiretamente, usar o valor de seu próprio membro enum associado.The associated value of an enum member may not, directly or indirectly, use the value of its own associated enum member. Além dessa restrição de circularidade, os inicializadores de membro de enumeração podem se referir livremente a outros inicializadores de membro de enumeração, independentemente da sua posição textual.Other than this circularity restriction, enum member initializers may freely refer to other enum member initializers, regardless of their textual position. Dentro de um inicializador de membro de enumeração, os valores de outros membros de enum são sempre tratados como tendo o tipo de seu tipo subjacente, de modo que as conversões não são necessárias ao fazer referência a outros membros de enumeração.Within an enum member initializer, values of other enum members are always treated as having the type of their underlying type, so that casts are not necessary when referring to other enum members.

O exemploThe example

enum Circular
{
    A = B,
    B
}

resulta em um erro de tempo de compilação porque as declarações de A e B são circulares.results in a compile-time error because the declarations of A and B are circular. A depende B explicitamente e B depende de A implicitamente.A depends on B explicitly, and B depends on A implicitly.

Os membros de enumeração são nomeados e têm o escopo definido de forma exatamente análoga aos campos dentro das classes.Enum members are named and scoped in a manner exactly analogous to fields within classes. O escopo de um membro de enumeração é o corpo de seu tipo de enumeração que o contém.The scope of an enum member is the body of its containing enum type. Dentro desse escopo, os membros de enumeração podem ser referenciados por seu nome simples.Within that scope, enum members can be referred to by their simple name. De todos os outros códigos, o nome de um membro de enumeração deve ser qualificado com o nome de seu tipo de enumeração.From all other code, the name of an enum member must be qualified with the name of its enum type. Os membros de enumeração não têm nenhuma acessibilidade declarada--um membro de enumeração é acessível se seu tipo de enumeração que o contém está acessível.Enum members do not have any declared accessibility -- an enum member is accessible if its containing enum type is accessible.

O tipo System. EnumThe System.Enum type

O tipo System.Enum é a classe base abstrata de todos os tipos enum (isso é distinto e diferente do tipo subjacente do tipo enum) e os membros herdados de System.Enum estão disponíveis em qualquer tipo de enumeração.The type System.Enum is the abstract base class of all enum types (this is distinct and different from the underlying type of the enum type), and the members inherited from System.Enum are available in any enum type. Uma conversão boxing (conversões Boxing) existe de qualquer tipo enum para System.Enum, e uma conversão unboxing (conversões unboxing) existe de System.Enum para qualquer tipo enum.A boxing conversion (Boxing conversions) exists from any enum type to System.Enum, and an unboxing conversion (Unboxing conversions) exists from System.Enum to any enum type.

Observe que System.Enum não é um enum_type.Note that System.Enum is not itself an enum_type. Em vez disso, é uma class_type da qual todos os enum_typesão derivados.Rather, it is a class_type from which all enum_types are derived. O tipo System.Enum herda do tipo System.ValueType (o tipo System. ValueType), que, por sua vez, herda do tipo object.The type System.Enum inherits from the type System.ValueType (The System.ValueType type), which, in turn, inherits from type object. Em tempo de execução, um valor do tipo System.Enum pode ser null ou uma referência a um valor em caixa de qualquer tipo de enumeração.At run-time, a value of type System.Enum can be null or a reference to a boxed value of any enum type.

Valores de enumeração e operaçõesEnum values and operations

Cada tipo de enumeração define um tipo distinto; uma conversão de enumeração explícita (conversões de enumeração explícitas) é necessária para converter entre um tipo de enumeração e um tipo integral ou entre dois tipos de enumeração.Each enum type defines a distinct type; an explicit enumeration conversion (Explicit enumeration conversions) is required to convert between an enum type and an integral type, or between two enum types. O conjunto de valores que um tipo de enumeração pode assumir não é limitado por seus membros enum.The set of values that an enum type can take on is not limited by its enum members. Em particular, qualquer valor do tipo subjacente de uma enumeração pode ser convertido para o tipo de enumeração e é um valor válido distinto desse tipo de enumeração.In particular, any value of the underlying type of an enum can be cast to the enum type, and is a distinct valid value of that enum type.

Os membros de enumeração têm o tipo de tipo de enumeração contendo (exceto em outros inicializadores de membro de enumeração: consulte membros de enumeração).Enum members have the type of their containing enum type (except within other enum member initializers: see Enum members). O valor de um membro enum declarado no tipo enum E com o valor associado v é (E)v.The value of an enum member declared in enum type E with associated value v is (E)v.

Os operadores a seguir podem ser usados em valores de tipos de enumeração: ==, !=, <, >, <=, >= (operadores de comparação de enumeração), binary + (operador deadição), binary - (operador de subtração), ^, &, | (operadores lógicos de enumeração), ~ (operador decomplemento) ++ --Incremento de sufixo e diminuição de operadores e incrementos de prefixo e de decréscimo). The following operators can be used on values of enum types: ==, !=, <, >, <=, >= (Enumeration comparison operators), binary + (Addition operator), binary - (Subtraction operator), ^, &, | (Enumeration logical operators), ~ (Bitwise complement operator), ++ and -- (Postfix increment and decrement operators and Prefix increment and decrement operators).

Cada tipo de enumeração deriva automaticamente da classe System.Enum (que, por sua vez, deriva de System.ValueType e object).Every enum type automatically derives from the class System.Enum (which, in turn, derives from System.ValueType and object). Assim, os métodos herdados e as propriedades dessa classe podem ser usados em valores de um tipo enum.Thus, inherited methods and properties of this class can be used on values of an enum type.