C # 'dinamiese' navraag ... Is dit regtig 'n VOORBEHOU navraag of net 'n identifiseerder wat beteken iets spesiaals wanneer dit gebruik word as tipe?

StackOverflow https://stackoverflow.com/questions/2124001

Vra

Ek het 'n C # 4,0 ontleder. Dit aanvaar 'dinamiese' as 'n navraag as 'n tipe. My parser reise oor state gevind in 'n werkende C # 3,0 programme van die vorm van:

dynamic = <exp> ;

So, dit dinamiese regtig 'n navraag? Of kan dit nog gebruik word as 'n arbitrêre identifiseerder naam? (Indien wel, hoekom is nie 'int' behandel op dieselfde manier)?

Is daar 'n verwysing spec iewers dat state of dinamiese is navraag? Die nuutste ECMA C # 4 spesifikasie nie eens te noem 'n dinamiese, en die beste wat ek kan vind op die MS webwerf is 'n "voorlopige spesifikasie" wat sy 'n navraag sê, maar ek vermoed dit is net slordige skryfwerk.

Was dit nuttig?

Oplossing

dynamic is 'n kontekstuele navraag as van C # 4,0. Die vierde uitgawe van die ECMA C # spec verwys nie na C # 4,0. (Let op die datum van publikasie 2006.)

MSDN beskryf dit as 'n navraag.

Dit is ook in hierdie tafel van kontekstuele sleutelwoorde . (Rol na onder.)

Ander wenke

Dit is nie 'n "normale" navraag soos if, for ens.

Dit is 'n kontekstuele navraag soos yield, from ens.

In die besonder, dit Versamel:

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

Maar dit beteken nie:

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

Jy wil hê na "ontsnapping" string soos volg:

object @string = 0;

Dit maak baie sin in terme van backward compatibility: dit is onwaarskynlik dat baie mense 'n tipe genoem dynamic (wat dubbelsinnigheid sal veroorsaak sal geskep het; IIRC die "regte" tipe oorwinnings in hierdie geval ) terwyl dit se baie waarskynlik dat bestaande kode gebruike veranderlikes genoem dynamic.

In sommige opsigte is dit nie eens nodig het om 'n kontekstuele navraag wees (en ek glo nie die spesifikasie ooit uitdruklik verwys na dit as sodanig) - jy kan dink dit as die naam van 'n tipe wat beskikbaar is altyd (soos string en object). Ek sou dink dat string ens gemaak sleutelwoorde van v1 om te verhoed dat verwarring, maar voeg egte dokumente (wat nie gebruik kan word as identifiseerders) sal 'n hoë verenigbaarheid koste nou.

Dit is 'n navraag. (sien wysig hieronder) Ek is 'n bietjie verward oor wat jy bedoel met "hoekom is nie 'int' op dieselfde manier behandel word?"

Jy kan dit nie doen hierdie: int int = 5;

Maar jy kan dit doen, maar dit is nie goeie praktyk: int @int = 5;

Die C # 4,0 spec doen melding dynamic in artikel 20.1.

EDIT: more info ...

Die gebruik van dinamiese as 'n veranderlike naam is toegelaat, so dit is nie 'n navraag (maar dit is 'n kontekstuele navraag - sien Sean Devlin se post ). Sien die kiekie hieronder met behulp NET 4.0 beta

dinamiese

Check uit Chris Burrow se blog post . 'N interessante aanhaling uit die post:

  

Soos jy kan sien, die publiek sigbaar is   lede wat die tipe dinamiese gebruik   eintlik, agter die skerms, gebruik die   tik voorwerp wanneer hulle vrygestel.   Daar is geen tipe raamwerk "dinamiese."   Maar dié "voorwerpe" is al   versier in so 'n wyse dat die   samesteller (of enigiemand anders) kan vertel   wat hulle veronderstel is om te hanteer   dinamiese.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top