2010-01-23 33 views
6

Mam parser C# 4.0. Przyjmuje "dynamiczny" jako słowo kluczowe jako typ. Moi parser zahaczyć sprawozdania znalezione w pracy C# 3.0 programy postaci:C# "dynamiczne" słowo kluczowe ... czy rzeczywiście jest słowem RESERVED lub po prostu identyfikatorem, który oznacza coś specjalnego, gdy jest używany jako typ?

dynamic = <exp> ; 

Tak, to naprawdę dynamicznego słowa kluczowego? Czy może nadal używać jako arbitralnej nazwy identyfikatora? (Jeśli tak, dlaczego nie traktuje się "int" w ten sam sposób)?

Czy istnieje specyfikacja gdzieś, która określa, czy dynamiczne jest słowo kluczowe? Najnowsza specyfikacja ECMA C# 4 nie wspomina nawet o "dynamice", a najlepsze, co mogę znaleźć na stronie MS, to "wstępna specyfikacja", która mówi o jej słowie kluczowym, ale podejrzewam, że to po prostu niechlujne pisanie.

+0

To może pomóc. http://blogs.msdn.com/ericlippert/archive/2009/05/11/reserved-and-contextual-keywords.aspx –

+0

@Eric: ładne tło. Brakowało mi tego, że var był słowem kluczowym kontekstowym, oops, mam parser, który powinien się dostosować. –

Odpowiedz

10

dynamic jest słowem kluczowym kontekstualnym jak C# 4.0. Czwarta edycja specyfikacji ECMA C# nie odnosi się do C# 4.0. (Uwaga na datę publikacji w 2006 r.)

MSDN opisuje go jako słowo kluczowe.

Jest również w tym table of contextual keywords. (W dół).

+0

Być może. Ale w tym samym dokumencie MSDN znajduje się sekcja o numerze keywords, w której "dynamiczny" jest wyraźnie nieobecny. –

+0

Twój link jest uszkodzony. Ale na stronie, do której się odnosisz, znajduje się w drugiej tabeli kontekstowych słów kluczowych. –

+0

Aha ... tego właśnie przegapiłem! Dziękuję bardzo! –

1

To słowo kluczowe. (patrz edycja poniżej) Jestem trochę zdezorientowany tym, co masz na myśli, mówiąc "dlaczego nie jest" int "traktowany w ten sam sposób?

Nie możesz tego zrobić: int int = 5;

Ale można to zrobić, choć nie jest to dobra praktyka: int @int = 5;

C# 4.0 spec wspomina dynamic w punkcie 20.1.

EDIT: więcej informacji ...

Korzystanie dynamiczny jako nazwy zmiennej jest dozwolone, więc nie jest to słowo kluczowe (ale jest to kontekstowe słów kluczowych - patrz Sean Devlin's post). Zobacz zrzut ekranu poniżej użyciu .NET 4.0 beta

dynamic

Check out Chris Burrow na blog post. Interesujący cytat z postu:

Jak widać, publicznie widocznych członkowie używające typ dynamiczny faktycznie, za kulisami, użyć obiektu typu, gdy są one emitowane. Brak typu struktury "dynamiczny". Jednak te "obiekty" są wszystkie udekorowane w taki sposób, że kompilator (lub ktokolwiek inny) może powiedzieć dynamicznie, że mają być obsługiwane .

+0

Jak dokładnie to znasz? ... Zgadzasz się, że program C# 3.0, który zawiera przypisania do "dynamicznych", jest nieważny w C# 4.0 (który łamie kompatybilność wsteczną, która zwykle jest nie-nie)? Jeśli przypisanie * jest * poprawne w C3.0, to dlaczego nie miałoby int = 7; mieć pozwolenie? –

+0

Myślę, że każda główna wersja języka dodała słowa kluczowe i złamała kompatybilność wsteczną. Na przykład. 'foreach' w C# 2.0 i' var' w C# 3.0. –

+0

... Tak, widziałem, że C# 4.0 spec; to ten, któremu nie ufam, jeśli chodzi o jego charakateryzację rzeczywistego słowa kluczowego. Specyfikacja C# 3.0 zawiera sekcję wyjaśnienia słów kluczowych; specyfikacja C# 4.0 nie jest i tak trudno jest powiedzieć, czy ten szczegół jest dokładnie adresowany. (Jestem pewien, że kompilator C# 4.0 ma opinię, ale tak samo będzie w złym kodery C3.0, który używał dynamicznego jako nazwa identyfikatora.) –

7

To nie jest "normalne" słowo kluczowe jak if, for itp

Jest to kontekstowe kluczowe jak yield, from etc.

W szczególności kompiluje:

object dynamic = 0; // dynamic is a contextual keyword 

ale to nie:

object string = 0; // string is a regular keyword 

Trzeba by "uciec" string takiego:

object @string = 0; 

ten ma wiele sensu pod względem kompatybilności wstecznej: jest mało prawdopodobne, aby wielu ludzi stworzyło typ o nazwie dynamic (co spowodowałoby niejednoznaczność; IIRC "prawdziwy" typ wygrywa w tym przypadku), podczas gdy jest to prawdopodobnie bardzo prawdopodobne, że istniejący kod wykorzystuje zmienne o nazwie dynamic.

Pod pewnymi względami nie musi to być nawet słowo kluczowe kontekstualne (i nie sądzę, że specyfikacja kiedykolwiek wyraźnie odnosi się do niego jako takiego) - można to nazwać typem, który jest zawsze dostępne (np. string i object). Mogę sobie wyobrazić, że string itd. Zostały stworzone jako słowa kluczowe z wersji 1, aby uniknąć nieporozumień, ale dodanie prawdziwych słów kluczowych (które nie mogą być używane jako identyfikatory) miałoby teraz wysoki koszt zgodności.

+0

Świetnie (naprawdę wierzę w to, ponieważ pozwoliłoby to uniknąć problemów ze zgodnością wsteczną). Ale ... gdzie jest autorytatywne źródło, z którego korzystasz, aby uzyskać ten konkretny fakt? –

+0

@Ira: Patrzę na kopię specyfikacji C# 4, która * nie * zawiera 'dynamiczny' wśród słów kluczowych; nie ma listy słów kluczowych kontekstowych. Edytuję dla nieco więcej informacji ... –

+0

Świetne wyjaśnienie Jon!Ale czuję, że użycie słowa "Zastrzeżone" zamiast "Normalnego" byłoby bardziej trafne, ponieważ istnieją dwa typy słów kluczowych zdefiniowanych w języku C# mianowicie zarezerwowane i kontekstowe. – RBT