C # 'dinamiese' navraag ... Is dit regtig 'n VOORBEHOU navraag of net 'n identifiseerder wat beteken iets spesiaals wanneer dit gebruik word as tipe?
-
22-09-2019 - |
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.
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 ??p>
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.