ich eher zufällig auf dieses seltsame Sache heute:Warum sollte das nicht kompilieren?
http://www.yoda.arachsys.com/csharp/teasers.html
Frage # 5.
Der Code:
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);
}
}
Jetzt nach den Antworten auf http://www.yoda.arachsys.com/csharp/teasers-answers.html für Frage # 5
... Es ist ein bekannter Fehler aufgrund einiger Optimierung zu früh getan werden, sammeln Konstanten 0 und denke, dass jede bekannte Konstante 0 in den Wert 0 eines beliebigen Enums konvertiert werden kann. Es ist jetzt bei uns, und es ist unwahrscheinlich, dass es jemals repariert wird, da es einen Code kaputt machen könnte, der technisch illegal ist, aber einwandfrei funktioniert. Es ist möglich, dass sich die Spezifikation natürlich ändert.
Aber warum?
One
& Une
sind beide const. I.e. Sie können zur Kompilierzeit berechnet werden, so dass es Foo f = 0
wird. Und da 0
ist ein gültiger Wert für eine enum
, warum sollte das nicht kompilieren?
Sie suchen so etwas wie 'Foo f' und dann' f.Bar = One - Une; 'richtig? –
Weil wahrscheinlich die Überprüfung "ist es eine konstante ganze Zahl? Wenn ja, ist es 0? Dann ist es in Ordnung, es implizit in eine Enum" zu werfen ist vor den konstanten Berechnungen getan. – xanatos
Typ Sicherheit. Selbst wenn Ihre Enumeration durch ein int unterstützt wird, ist Ihr enum * nicht * ein int. Es stellt seine eigenen Konzepte dar, und daher ist es nicht die richtige Art, mit einem int zu einem enum zu arbeiten. –