C # ‚dynamische‘ Schlüsselwort ... ist es wirklich ein reserviertes Schlüsselwort oder nur eine Kennung, die Mittel, um etwas Besonderes, wenn als Typ verwendet?
-
22-09-2019 - |
Frage
Ich habe einen C # 4.0-Parser. Er akzeptiert ‚dynamisch‘ als Schlüsselwort als Typ. Mein Parser stolpert über Aussagen gefunden C # 3.0 Programme der Form in der Arbeit:
dynamic = <exp> ;
Also, es dynamisch wirklich ein Stichwort? Oder kann es noch als willkürliche Bezeichnernamen verwendet werden? (Wenn ja, warum nicht ‚int‘ die gleiche Art und Weise behandelt werden)?
Gibt es eine irgendwo spec Referenz, dass die Staaten, ob dynamischen Keyword? Die neueste ECMA C # 4-Spezifikation nicht einmal erwähnt ‚dynamisch‘ und das Beste, was ich an der MS-Website finden kann, ist eine „vorläufige Spezifikation“, das besagt, es ist ein Schlüsselwort, aber ich vermute, das ist nur schlampig schriftlich.
Lösung
dynamic
ist ein Kontext Stichwort als von C # 4.0. Die vierte Ausgabe des ECMA C # spec bezieht sich nicht auf C # 4.0. (Beachten Sie das 2006 Veröffentlichungsdatum.)
MSDN beschreibt es als Schlüsselwort.
Es ist auch in diesem Tabelle kontextuelle keywords . (Nach unten scrollen).
Andere Tipps
Es ist kein "normales" Stichwort wie if
, for
etc.
Es ist ein Kontext Schlüsselwörter wie yield
, from
etc.
Insbesondere diese compiliert:
object dynamic = 0; // dynamic is a contextual keyword
, aber das bedeutet nicht:
object string = 0; // string is a regular keyword
Sie würden müssen "escape" string
wie folgt aus:
object @string = 0;
Das macht sehr viel Sinn in Bezug auf die Abwärtskompatibilität: es unwahrscheinlich ist, dass viele Menschen eine erstellt haben wird type genannt dynamic
(die Mehrdeutigkeit verursachen würde; IIRC die „echten“ Typ gewinnt in diesem Fall ), während es uns sehr wahrscheinlich, dass vorhandene Code verwendet Variablen genannt dynamic
.
In gewisser Weise ist es nicht einmal ein Kontext Stichwort sein muß (und ich glaube nicht, die Spezifikation jemals ausdrücklich als solche bezeichnet) - Sie davon, wie der Name eines Typs, der immer verfügbar ist, denken (wie string
und object
). Ich könnte mir vorstellen, dass string
etc gemacht wurden Stichworte von v1 Um Verwirrung zu vermeiden, aber das Hinzufügen echte Keywords (die nicht als Bezeichner verwendet werden kann) würde nun eine hohe Kompatibilität Kosten hat.
Es ist ein Schlüsselwort. (siehe bearbeiten unten) Ich bin ein wenig verwirrt darüber, was Sie unter „warum nicht‚int‘die gleiche Art und Weise behandelt?“
Sie können nicht dies tun: int int = 5;
Aber Sie können dies tun, obwohl es ist keine gute Praxis: int @int = 5;
Die Sean Devlin Post ). Siehe Screenshot unten .NET 4.0 Beta mit
Schauen Sie sich Chris Burrow Blog-Post . Ein interessantes Zitat aus dem Beitrag:
Wie Sie sehen können, die öffentlich sichtbar Mitglieder, die den Typ verwenden dynamische tatsächlich, hinter den Kulissen, verwenden Sie die Type-Objekt, wenn sie abgegeben werden. Es gibt keinen Gerüsttyp „dynamisch“. diese „Objekte“ sind jedoch alle derart eingerichtet, dass die Compiler (oder jemand anderes) kann sagen, dass sie behandelt werden soll dynamisch.