mi sono imbattuto su questa cosa strana oggi:Perché questo non dovrebbe essere compilato?
http://www.yoda.arachsys.com/csharp/teasers.html
Domanda # 5.
Il codice:
using System;
class Test
{
enum Foo
{
Bar,
Baz
};
const int One = 1;
const int Une = 1;
static void Main()
{
Foo f = One - Une;
Console.WriteLine(f);
}
}
Ora, secondo le risposte su http://www.yoda.arachsys.com/csharp/teasers-answers.html per la domanda # 5
... E 'un bug conosciuto a causa di qualche ottimizzazione viene fatto troppo presto, la raccolta di costanti 0 e pensando che qualsiasi costante 0 conosciuta dovrebbe essere convertibile al valore 0 di qualsiasi enum. È con noi ora, e improbabile che venga mai riparato in quanto potrebbe rompere un codice tecnicamente illegale ma perfettamente funzionante. È possibile che le specifiche cambino invece, ovviamente.
Ma perché?
One
& Une
entrambi costanti. Cioè possono essere calcolati in fase di compilazione, quindi diventa Foo f = 0
. E poiché 0
è un valore valido per qualsiasi enum
, perché non dovrebbe essere compilato?
Si sta cercando qualcosa come questo 'Foo f' e poi' f.Bar = One - Une; 'giusto? –
Perché probabilmente il controllo "è un numero intero costante? Se sì, è 0? Allora è ok implicitamente lanciarlo in un enum" è fatto PRIMA dei calcoli costanti. – xanatos
Tipo sicurezza. Anche se il tuo enum è supportato da un int, il tuo enum non è * un * int. Rappresenta i propri concetti e, in quanto tale, assegnare un int a un enum non è il modo corretto di lavorarci. –