Tipi di enumerazione (riferimenti per C#)Enumeration types (C# reference)

Un tipo di enumerazione o un tipo enum è un tipo di valore definito da un set di costanti denominate del tipo numerico integrale sottostante.An enumeration type (or enum type) is a value type defined by a set of named constants of the underlying integral numeric type. Per definire un tipo di enumerazione, usare la enum parola chiave e specificare i nomi dei membri enum:To define an enumeration type, use the enum keyword and specify the names of enum members:

enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

Per impostazione predefinita, i valori costanti associati dei membri enum sono di tipo int , mentre iniziano con zero e aumentano di uno dopo l'ordine di testo della definizione.By default, the associated constant values of enum members are of type int; they start with zero and increase by one following the definition text order. È possibile specificare in modo esplicito qualsiasi altro tipo numerico integrale come tipo sottostante di un tipo di enumerazione.You can explicitly specify any other integral numeric type as an underlying type of an enumeration type. È anche possibile specificare in modo esplicito i valori costanti associati, come illustrato nell'esempio seguente:You can also explicitly specify the associated constant values, as the following example shows:

enum ErrorCode : ushort
{
    None = 0,
    Unknown = 1,
    ConnectionLost = 100,
    OutlierReading = 200
}

Non è possibile definire un metodo all'interno della definizione di un tipo di enumerazione.You cannot define a method inside the definition of an enumeration type. Per aggiungere funzionalità a un tipo di enumerazione, creare un metodo di estensione.To add functionality to an enumeration type, create an extension method.

Il valore predefinito di un tipo di enumerazione E è il valore prodotto dall'espressione (E)0 , anche se zero non ha il membro enum corrispondente.The default value of an enumeration type E is the value produced by expression (E)0, even if zero doesn't have the corresponding enum member.

Usare un tipo di enumerazione per rappresentare una scelta da un set di valori che si escludono a vicenda o da una combinazione di opzioni.You use an enumeration type to represent a choice from a set of mutually exclusive values or a combination of choices. Per rappresentare una combinazione di scelte, definire un tipo di enumerazione come flag di bit.To represent a combination of choices, define an enumeration type as bit flags.

Tipi di enumerazione come flag di bitEnumeration types as bit flags

Se si vuole che un tipo di enumerazione rappresenti una combinazione di scelte, definire i membri enum per tali scelte in modo che una singola scelta sia un campo di bit.If you want an enumeration type to represent a combination of choices, define enum members for those choices such that an individual choice is a bit field. Ovvero i valori associati di tali membri enum dovrebbero essere le potenze di due.That is, the associated values of those enum members should be the powers of two. Quindi, è possibile usare gli operatori logici bit per bit | o & per combinare le scelte o le combinazioni Intersect delle scelte, rispettivamente.Then, you can use the bitwise logical operators | or & to combine choices or intersect combinations of choices, respectively. Per indicare che un tipo di enumerazione dichiara campi di bit, applicarvi l'attributo Flags .To indicate that an enumeration type declares bit fields, apply the Flags attribute to it. Come illustrato nell'esempio seguente, è anche possibile includere alcune combinazioni tipiche nella definizione di un tipo di enumerazione.As the following example shows, you can also include some typical combinations in the definition of an enumeration type.

[Flags]
public enum Days
{
    None      = 0b_0000_0000,  // 0
    Monday    = 0b_0000_0001,  // 1
    Tuesday   = 0b_0000_0010,  // 2
    Wednesday = 0b_0000_0100,  // 4
    Thursday  = 0b_0000_1000,  // 8
    Friday    = 0b_0001_0000,  // 16
    Saturday  = 0b_0010_0000,  // 32
    Sunday    = 0b_0100_0000,  // 64
    Weekend   = Saturday | Sunday
}

public class FlagsEnumExample
{
    public static void Main()
    {
        Days meetingDays = Days.Monday | Days.Wednesday | Days.Friday;
        Console.WriteLine(meetingDays);
        // Output:
        // Monday, Wednesday, Friday

        Days workingFromHomeDays = Days.Thursday | Days.Friday;
        Console.WriteLine($"Join a meeting by phone on {meetingDays & workingFromHomeDays}");
        // Output:
        // Join a meeting by phone on Friday

        bool isMeetingOnTuesday = (meetingDays & Days.Tuesday) == Days.Tuesday;
        Console.WriteLine($"Is there a meeting on Tuesday: {isMeetingOnTuesday}");
        // Output:
        // Is there a meeting on Tuesday: False

        var a = (Days)37;
        Console.WriteLine(a);
        // Output:
        // Monday, Wednesday, Saturday
    }
}

Per altre informazioni ed esempi, vedere la System.FlagsAttribute pagina di riferimento dell'API e i membri non esclusivi e la sezione attributo Flags della System.Enum pagina di riferimento dell'API.For more information and examples, see the System.FlagsAttribute API reference page and the Non-exclusive members and the Flags attribute section of the System.Enum API reference page.

Il tipo System. Enum e il vincolo enumThe System.Enum type and enum constraint

Il System.Enum tipo è la classe di base astratta di tutti i tipi di enumerazione.The System.Enum type is the abstract base class of all enumeration types. Sono disponibili diversi metodi per ottenere informazioni su un tipo di enumerazione e i relativi valori.It provides a number of methods to get information about an enumeration type and its values. Per ulteriori informazioni ed esempi, vedere la System.Enum pagina di riferimento dell'API.For more information and examples, see the System.Enum API reference page.

A partire da C# 7,3, è possibile usare System.Enum in un vincolo della classe di base (noto come vincolo enum) per specificare che un parametro di tipo è un tipo di enumerazione.Beginning with C# 7.3, you can use System.Enum in a base class constraint (that is known as the enum constraint) to specify that a type parameter is an enumeration type. Qualsiasi tipo di enumerazione soddisfa anche il struct vincolo, che viene usato per specificare che un parametro di tipo è un tipo di valore non nullable.Any enumeration type also satisfies the struct constraint, which is used to specify that a type parameter is a non-nullable value type.

ConversioniConversions

Per qualsiasi tipo di enumerazione esistono conversioni esplicite tra il tipo di enumerazione e il tipo integrale sottostante.For any enumeration type, there exist explicit conversions between the enumeration type and its underlying integral type. Se si esegue il cast di un valore enum al relativo tipo sottostante, il risultato è il valore integrale associato di un membro enum.If you cast an enum value to its underlying type, the result is the associated integral value of an enum member.

public enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

public class EnumConversionExample
{
    public static void Main()
    {
        Season a = Season.Autumn;
        Console.WriteLine($"Integral value of {a} is {(int)a}");  // output: Integral value of Autumn is 2

        var b = (Season)1;
        Console.WriteLine(b);  // output: Summer

        var c = (Season)4;
        Console.WriteLine(c);  // output: 4
    }
}

Utilizzare il Enum.IsDefined metodo per determinare se un tipo di enumerazione contiene un membro enum con il determinato valore associato.Use the Enum.IsDefined method to determine whether an enumeration type contains an enum member with the certain associated value.

Per qualsiasi tipo di enumerazione esistono rispettivamente le conversioni Boxing e unboxing da e verso il System.Enum tipo.For any enumeration type, there exist boxing and unboxing conversions to and from the System.Enum type, respectively.

Specifiche del linguaggio C#C# language specification

Per altre informazioni, vedere le sezioni seguenti delle specifiche del linguaggio C#:For more information, see the following sections of the C# language specification:

Vedi ancheSee also