Incuriosito da questo frammento dal libro di Box & Sells (l'edizione italiana, p. 119):
"L'attributo [System.Flags] influenza anche l'implementazione di ToString in modo che la rappresentazione in stringa del valore sarà una lista separata da virgole dei nomi dei membri anziché del singolo membro.",
ho giocato un po'. Per esempio, questo snippet:
using System;
class Foo
{
[Flags]
enum NaN
{
Non = 1,
un = 2,
numero = 4,
reale = 8
}
static void Main()
{
NaN f = NaN.Non | NaN.un | NaN.numero | NaN.reale;
Console.WriteLine(double.NaN.ToString(new System.Globalization.CultureInfo("it-IT")));
Console.WriteLine(f.ToString().Replace(",", string.Empty));
Console.Read();
}
}
stampa a video:
Non un numero reale
Non un numero reale
Un esempio meno folle :-) lo trovate nella documentazione di System.FlagsAttribute.
Continuando a giocare, sono partito da questo snippet:
using System;
class Bar
{
[Flags]
enum Baz
{
}
static void Main()
{
Baz b = (Baz)2004;
Console.WriteLine(b.ToString());
Console.Read();
}
}
che stampa a video 2004. Niente di strano.
Ma, se al posto di 2004 scriviamo 0, otteniamo System.IndexOutOfRangeException!...
using System;
class Bar
{
[Flags]
enum Baz
{
}
static void Main()
{
Baz b = (Baz)0;
Console.WriteLine(b.ToString());
Console.Read();
}
}
Cosa che non succederebbe se togliessimo l'attributo [Flags]:
using System;
class Bar
{
enum Baz
{
}
static void Main()
{
Baz b = (Baz)0;
Console.WriteLine(b.ToString());
Console.Read();
}
}
Qual è la vostra spiegazione per il comportamento di questi ultimi 2 snippet?