Note
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãµã€ã³ã€ã³ãŸãã¯ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
12.1 å šè¬
åŒã¯ãæŒç®åãšãªãã©ã³ãã®ã·ãŒã±ã³ã¹ã§ãã ãã®å¥ã¯ãæ§æããªãã©ã³ããšæŒç®åã®è©äŸ¡é åºãããã³åŒã®æå³ãå®çŸ©ããŸãã
åŒ E ã¯ããã©ã¡ãŒã¿ãŒã null é蚱容å€åã§ã¯ãªããæ¬¡ã®ããããã®æ¡ä»¶ãä¿æãããŠãŒã¶ãŒå®çŸ©å€æ §10.5 ã®å¯Ÿè±¡ã§ãªãå ŽåãéšååŒ Eâ ãçŽæ¥å«ãã§ãããšèšãããŸãã
- E 㯠Eâ ã§ãã
-
E ããã£ãã§
(Eâ)ãããåŒã§ãããEâ ã«çŽæ¥ Eâ ãå«ãŸããŠããå Žåã -
E ã null ã蚱容ããæŒç®ååŒ
Eâ!ã§ãããEâ ã«çŽæ¥ Eâ ãå«ãŸããŠããå Žåã -
E ããã£ã¹ãåŒ
(T)Eâã§ããã£ã¹ãã Eâ ãããã©ã¡ãŒã¿ãŒã null é蚱容å€åã§ã¯ãªããEâ ãçŽæ¥ Eâ ãå«ãéãªããããããŠãŒã¶ãŒå®çŸ©å€æã«é©çšãããªãå Žåã
12.2 åŒã®åé¡
12.2.1 å šè¬
åŒã®çµæã¯ã次ã®ãããããšããŠåé¡ãããŸãã
- å€ã ãã¹ãŠã®å€ã«ã¯ãåãé¢é£ä»ããããŠããŸãã
- 倿°ã ç¹ã«æå®ããªãéãã倿°ã¯æç€ºçã«åæå®ãããé¢é£ä»ããããå (ã€ãŸãã倿°ã®å®£èšãããå) ãæã¡ãŸãã æé»çã«åæå®ããã倿°ã«ã¯ãé¢é£ä»ããããåããããŸããã
- Null ãªãã©ã«ã ãã®åé¡ãæã€åŒã¯ãåç §åãŸã㯠null 蚱容å€åã«æé»çã«å€æã§ããŸãã
- å¿å颿°ã ãã®åé¡ãæã€åŒã¯ãäºææ§ã®ããããªã²ãŒãåãŸãã¯åŒããªãŒåã«æé»çã«å€æã§ããŸãã
- ã¿ãã«ã ãã¹ãŠã®ã¿ãã«ã«ã¯åºå®æ°ã®èŠçŽ ããããããããã«åŒãšãªãã·ã§ã³ã®ã¿ãã«èŠçŽ åãä»ããŸãã
- ãããã㣠ã¢ã¯ã»ã¹ã ãã¹ãŠã®ãããã㣠ã¢ã¯ã»ã¹ã«ã¯ãé¢é£ä»ããããå (ã€ãŸããããããã£ã®å) ããããŸãã ããã«ããããã㣠ã¢ã¯ã»ã¹ã«ã¯ãã€ã³ã¹ã¿ã³ã¹åŒãé¢é£ä»ããããŠããå ŽåããããŸãã ã€ã³ã¹ã¿ã³ã¹ ãããã㣠ã¢ã¯ã»ã¹ã®ã¢ã¯ã»ãµãŒãåŒã³åºããããšãã€ã³ã¹ã¿ã³ã¹åŒãè©äŸ¡ããçµæã¯ã
this(§12.8.14) ã§è¡šãããã€ã³ã¹ã¿ã³ã¹ã«ãªããŸãã - ã€ã³ãã¯ãµãŒãžã®ã¢ã¯ã»ã¹ã ãã¹ãŠã®ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã«ã¯ãã€ã³ãã¯ãµãŒã®èŠçŽ åãšãããé¢é£ä»ããããåããããŸãã ããã«ãã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã«ã¯ãé¢é£ä»ããããã€ã³ã¹ã¿ã³ã¹åŒãšãé¢é£ä»ããããåŒæ°ãªã¹ãããããŸãã ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã®ã¢ã¯ã»ãµãŒãåŒã³åºããããšãã€ã³ã¹ã¿ã³ã¹åŒãè©äŸ¡ããçµæã¯ã
this(§12.8.14) ã§è¡šãããã€ã³ã¹ã¿ã³ã¹ã«ãªããåŒæ°ãªã¹ããè©äŸ¡ããçµæãåŒã³åºãã®ãã©ã¡ãŒã¿ãŒ ãªã¹ãã«ãªããŸãã - äœãããªãã ããã¯ãåŒãæ»ãå€ã®åã
voidã®ã¡ãœããã®åŒã³åºãã§ããå Žåã«çºçããŸãã nothing ã«åé¡ãããåŒã¯ã statement_expression (§13.7) ã®ã³ã³ããã¹ããŸã㯠lambda_expression (§12.22) ã®æ¬äœãšããŠã®ã¿æå¹ã§ãã
倧ããªåŒã®éšååŒãšããŠçºçããåŒã®å Žåã¯ã泚æãå¿ èŠã§ããçµæã¯æ¬¡ã®ãããããšããŠåé¡ããããšãã§ããŸãã
- åå空éã ãã®åé¡ãæã€åŒã¯ã member_access ã®å·ŠåŽ (§12.8.7) ãšããŠã®ã¿è¡šç€ºã§ããŸãã ãã®ä»ã®ã³ã³ããã¹ãã§ã¯ãåå空éãšããŠåé¡ãããåŒã«ãã£ãŠã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
- åã ãã®åé¡ãæã€åŒã¯ã member_access ã®å·ŠåŽ (§12.8.7) ãšããŠã®ã¿è¡šç€ºã§ããŸãã ãã®ä»ã®ã³ã³ããã¹ãã§ã¯ãåãšããŠåé¡ãããåŒã«ãã£ãŠã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
- ã¡ãœãã ã°ã«ãŒããã¡ã³ããŒæ€çŽ¢ (§12.5) ã«èµ·å ãããªãŒããŒããŒããããã¡ãœããã®ã»ããã§ãã ã¡ãœãã ã°ã«ãŒãã«ã¯ãé¢é£ä»ããããã€ã³ã¹ã¿ã³ã¹åŒãšãé¢é£ä»ããããååŒæ°ãªã¹ããå«ãŸããå ŽåããããŸãã ã€ã³ã¹ã¿ã³ã¹ ã¡ãœãããåŒã³åºããããšãã€ã³ã¹ã¿ã³ã¹åŒãè©äŸ¡ããçµæã¯ã
this(§12.8.14) ã§è¡šãããã€ã³ã¹ã¿ã³ã¹ã«ãªããŸãã ã¡ãœãã ã°ã«ãŒã㯠ãinvocation_expression (§12.8.10) ãŸã㯠delegate_creation_expression (§12.8.17.5) ã§èš±å¯ãããäºææ§ã®ããããªã²ãŒãå (§10.8) ã«æé»çã«å€æã§ããŸãã ãã®ä»ã®ã³ã³ããã¹ãã§ã¯ãã¡ãœãã ã°ã«ãŒããšããŠåé¡ãããåŒã«ãã£ãŠã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã - ã€ãã³ã ã¢ã¯ã»ã¹ã ãã¹ãŠã®ã€ãã³ã ã¢ã¯ã»ã¹ã«ã¯ãé¢é£ä»ããããå (ã€ãŸããã€ãã³ãã®å) ããããŸãã ããã«ãã€ãã³ã ã¢ã¯ã»ã¹ã«ã¯ãã€ã³ã¹ã¿ã³ã¹åŒãé¢é£ä»ããããŠããå ŽåããããŸãã ã€ãã³ã ã¢ã¯ã»ã¹ã¯ã
+=æŒç®åãš-=æŒç®å (§12.24.6) ã®å·Šãªãã©ã³ããšããŠè¡šç€ºãããå ŽåããããŸãã ãã®ä»ã®ã³ã³ããã¹ãã§ã¯ãã€ãã³ã ã¢ã¯ã»ã¹ãšããŠåé¡ãããåŒã«ãã£ãŠã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã ã€ã³ã¹ã¿ã³ã¹ ã€ãã³ã ã¢ã¯ã»ã¹ã®ã¢ã¯ã»ãµãŒãåŒã³åºããããšãã€ã³ã¹ã¿ã³ã¹åŒãè©äŸ¡ããçµæã¯ãthis(§12.8.14) ã§è¡šãããã€ã³ã¹ã¿ã³ã¹ã«ãªããŸãã - ã¹ããŒåŒãåŒå ã§äŸå€ãã¹ããŒããããã«ãããŸããŸãªã³ã³ããã¹ãã§äœ¿çšã§ããŸãã throw åŒã¯ãæé»ç倿ã«ãã£ãŠãä»»æã®åã«å€æãããå ŽåããããŸãã
ãããã㣠ã¢ã¯ã»ã¹ãŸãã¯ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã¯ãget ã¢ã¯ã»ãµãŒãŸã㯠set ã¢ã¯ã»ãµãŒã®åŒã³åºããå®è¡ããããšã§ãåžžã«å€ãšããŠååé¡ãããŸãã ç¹å®ã®ã¢ã¯ã»ãµãŒã¯ãããããã£ãŸãã¯ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã®ã³ã³ããã¹ãã«ãã£ãŠæ±ºå®ãããŸããã¢ã¯ã»ã¹ãå²ãåœãŠã®ã¿ãŒã²ããã§ããå Žåã¯ãset ã¢ã¯ã»ãµãŒãåŒã³åºãããŠæ°ããå€ (§12.24.2) ãå²ãåœãŠãããŸãã ãã以å€ã®å Žåã¯ãget ã¢ã¯ã»ãµãŒãåŒã³åºãããçŸåšã®å€ (§12.2.2) ãååŸãããŸãã
ã€ã³ã¹ã¿ã³ã¹ ã¢ã¯ã»ãµãŒ ã¯ãã€ã³ã¹ã¿ã³ã¹ã«å¯Ÿãããããã㣠ã¢ã¯ã»ã¹ãã€ã³ã¹ã¿ã³ã¹ã§ã®ã€ãã³ã ã¢ã¯ã»ã¹ããŸãã¯ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã§ãã
12.2.2 åŒã®å€
åŒãå«ãã³ã³ã¹ãã©ã¯ãã®ã»ãšãã©ã¯ãæçµçã«åŒã å€ã衚ãå¿ èŠããããŸãã ãã®ãããªå Žåãå®éã®åŒãåå空éãåãã¡ãœãã ã°ã«ãŒãããŸãã¯äœã瀺ããŠããªãå Žåãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã ãã ããåŒããããã㣠ã¢ã¯ã»ã¹ãã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ãã¿ãã« ãªãã©ã«ããŸãã¯å€æ°ã瀺ãå Žåãããããã£ãã€ã³ãã¯ãµãŒãã¿ãã« ãªãã©ã«ããŸãã¯å€æ°ã®å€ã¯æé»çã«çœ®ãæããããŸãã
- 倿°ã®å€ã¯ã倿°ã«ãã£ãŠèå¥ãããã¹ãã¬ãŒãžã®å Žæã«çŸåšæ ŒçŽãããŠããå€ã«ãããŸããã 倿°ã¯ãå€ãååŸããåã«ç¢ºå®ã«å²ãåœãŠãããŠãã (§9.4) ãšèŠãªãããããã³ã³ãã€ã«æãšã©ãŒãçºçãããšèŠãªãããŸãã
- ãããã㣠ã¢ã¯ã»ã¹åŒã®å€ã¯ãããããã£ã® get ã¢ã¯ã»ãµãŒãåŒã³åºãããšã«ãã£ãŠååŸãããŸãã ããããã£ã« get ã¢ã¯ã»ãµãŒããªãå Žåã¯ãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã ãã以å€ã®å Žåã¯ã颿°ã¡ã³ããŒåŒã³åºã (§12.6.6) ãå®è¡ãããåŒã³åºãã®çµæããããã㣠ã¢ã¯ã»ã¹åŒã®å€ã«ãªããŸãã
- ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹åŒã®å€ã¯ãã€ã³ãã¯ãµãŒã® get ã¢ã¯ã»ãµãŒãåŒã³åºãããšã«ãã£ãŠååŸãããŸãã ã€ã³ãã¯ãµãŒã« get ã¢ã¯ã»ãµãŒããªãå Žåã¯ãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã ãã以å€ã®å Žåã¯ãã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹åŒã«é¢é£ä»ããããåŒæ°ãªã¹ãã䜿çšããŠé¢æ°ã¡ã³ããŒåŒã³åºã (§12.6.6) ãå®è¡ãããåŒã³åºãã®çµæãã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹åŒã®å€ã«ãªããŸãã
- åãæã€ã¿ãã« ãªãã©ã«ã®å€ã¯ãåèŠçŽ åŒãå·Šããå³ã«é çªã«è©äŸ¡ããããšã«ãã£ãŠååŸãããŸã (§12.8.6)ã åãæããªãã¿ãã« ãªãã©ã«ã®å€ãååŸãããšãšã©ãŒã«ãªããŸãã
12.3 éçããã³åçãã€ã³ãã£ã³ã°
12.3.1 å šè¬
ãã€ã³ã ã¯ãåŒ (åŒæ°ããªãã©ã³ããåä¿¡è ) ã®åãŸãã¯å€ã«åºã¥ããŠãæŒç®ãäœãåç §ããã®ããæ±ºå®ããããã»ã¹ã§ãã ããšãã°ãã¡ãœããåŒã³åºãã®ãã€ã³ãã¯ãåä¿¡åŽãšåŒæ°ã®åã«åºã¥ããŠæ±ºå®ãããŸãã æŒç®åã®ãã€ã³ãã¯ããã®ãªãã©ã³ãã®åã«åºã¥ããŠæ±ºå®ãããŸãã
C# ã§ã¯ãæŒç®ã®ãã€ã³ãã¯éåžžããã®éšååŒã®ã³ã³ãã€ã«æã®åã«åºã¥ããŠã³ã³ãã€ã«æã«æ±ºå®ãããŸãã åæ§ã«ãåŒã«ãšã©ãŒãå«ãŸããŠããå Žåã¯ããšã©ãŒãæ€åºãããã³ã³ãã€ã«æã«å ±åãããŸãã ãã®ã¢ãããŒãã¯ã éçãã€ã³ãã£ã³ã°ãšåŒã°ããŸãã
ãã ããåŒã åçãªåŒ ã§ããå Žå (ã€ãŸããåã dynamic) å Žåãããã¯ãåå ãããã€ã³ãã£ã³ã°ãã³ã³ãã€ã«æã®åã§ã¯ãªããå®è¡æã®åã«åºã¥ããŠããå¿
èŠãããããšã瀺ããŸãã ãããã£ãŠããã®ãããªæŒç®ã®ãã€ã³ãã¯ãããã°ã©ã ã®å®è¡äžã«æŒç®ãå®è¡ããããŸã§é
å»¶ãããŸãã ããã¯ã åçãã€ã³ãã£ã³ã°ãšåŒã°ããŸãã
æŒç®ãåçã«ãã€ã³ããããŠããå Žåãã³ã³ãã€ã«æã«ç¢ºèªã¯ã»ãšãã©ãŸãã¯ãŸã£ããå®è¡ãããŸããã 代ããã«ãå®è¡æãã€ã³ãã£ã³ã°ã倱æããå Žåããšã©ãŒã¯å®è¡æã«äŸå€ãšããŠå ±åãããŸãã
C# ã§ã®æ¬¡ã®æŒç®ã¯ãã€ã³ãã£ã³ã°ã®å¯Ÿè±¡ãšãªããŸãã
- ã¡ã³ã㌠ã¢ã¯ã»ã¹:
e.M - ã¡ãœããã®åŒã³åºã:
e.M(eâ,...,eáµ¥) - ããªã²ãŒãã®åŒã³åºã:
e(eâ,...,eáµ¥) - èŠçŽ ã¢ã¯ã»ã¹:
e[eâ,...,eáµ¥] - ãªããžã§ã¯ãã®äœæ: new
C(eâ,...,eáµ¥) - ãªãŒããŒããŒããããåé
æŒç®å:
+ã-ã!(è«çåŠå®ã®ã¿)ã~ã++ã--ãtrueãfalse - ãªãŒããŒããŒããããäºé
æŒç®å:
+ã-ã*ã/ã%ã&ã&&ã|||ã??ã^ã<<ã>>ã>>>(éçãã€ã³ãã£ã³ã°ã®ã¿)ã==ã!=ã>ã<ã>=ã<= - 代å
¥æŒç®å:
=ã= refã+=ã-=ã*=ã/=ã%=ã&=ã|=ã^=ã<<=ã>>=ã>>>=(éçãã€ã³ãã£ã³ã°ã®ã¿)??= - æé»çãªåå€æãšæç€ºçãªå倿
åçãªåŒãé¢ä¿ããªãå ŽåãC# ã§ã¯æ¢å®ã§éçãã€ã³ãã£ã³ã°ã䜿çšãããŸããã€ãŸããéžæããã»ã¹ã§ã³ã³ãã€ã«æã®éšååŒã®åã䜿çšãããŸãã ãã ããäžèšã®æŒç®ã®éšååŒã® 1 ã€ãåçãªåŒã§ããå ŽåãæŒç®ã¯ä»£ããã«åçã«ãã€ã³ããããŸãã
ã¡ãœããåŒã³åºããåçã«ãã€ã³ããããåä¿¡åŽãå«ããã©ã¡ãŒã¿ãŒã®ãããããå ¥åãã©ã¡ãŒã¿ãŒã§ããå Žåãã³ã³ãã€ã«æãšã©ãŒã«ãªããŸãã
12.3.2 ãã€ã³ãã£ã³ã° ã¿ã€ã
éçãã€ã³ãã£ã³ã°ã¯ã³ã³ãã€ã«æã«è¡ãããŸãããåçãã€ã³ãã£ã³ã°ã¯å®è¡æã«è¡ãããŸãã æ¬¡ã®ãµãã¯ã©ãŠã¹ã§ã¯ã ãã€ã³ãæ ãšããçšèªã¯ããã€ã³ãããã€è¡ããããã«å¿ããŠãã³ã³ãã€ã«æãŸãã¯å®è¡æãæããŸãã
äŸ: éçãã€ã³ãã£ã³ã°ãšåçãã€ã³ãã£ã³ã°ãšãã€ã³ãã£ã³ã°æéã®æŠå¿µã次ã«ç€ºããŸãã
object o = 5; dynamic d = 5; Console.WriteLine(5); // static binding to Console.WriteLine(int) Console.WriteLine(o); // static binding to Console.WriteLine(object) Console.WriteLine(d); // dynamic binding to Console.WriteLine(int)æåã® 2 ã€ã®åŒã³åºãã¯éçã«ãã€ã³ããããŸãã
Console.WriteLineã®ãªãŒããŒããŒãã¯ãåŒæ°ã®ã³ã³ãã€ã«æã®åã«åºã¥ããŠéžæãããŸãã ãããã£ãŠããã€ã³ãã£ã³ã° ã¿ã€ã ã¯ãã³ã³ãã€ã«æã§ãã3 çªç®ã®åŒã³åºãã¯åçã«ãã€ã³ããããŸãã
Console.WriteLineã®ãªãŒããŒããŒãã¯ããã®åŒæ°ã®å®è¡æã®åã«åºã¥ããŠéžæãããŸãã ããã¯ãåŒæ°ãåçãªåŒã§ãããã³ã³ãã€ã«æã®åãåçã§ããããã«çºçããŸãã ãããã£ãŠã3 çªç®ã®åŒã³åºãã®ãã€ã³ãæé㯠å®è¡æã§ããçµäºãµã³ãã«
12.3.3 åçãã€ã³ãã£ã³ã°
ãã®ãµãã¯ã©ã¹ã¯æçã§ãã
åçãã€ã³ãã£ã³ã°ã䜿çšãããšãC# ããã°ã©ã ã¯åçãªããžã§ã¯ã(C# åã·ã¹ãã ã®éåžžã®ã«ãŒã«ã«åŸããªããªããžã§ã¯ã)ãšå¯Ÿè©±ã§ããŸãã åçãªããžã§ã¯ãã¯ãç°ãªãåã·ã¹ãã ãæã€ä»ã®ããã°ã©ãã³ã°èšèªã®ãªããžã§ã¯ãã§ããå Žåãããã°ãããŸããŸãªæäœã«å¯ŸããŠç¬èªã®ãã€ã³ã ã»ãã³ãã£ã¯ã¹ãå®è£ ããããã«ããã°ã©ã ã«ãã£ãŠèšå®ããããªããžã§ã¯ãã§ããå ŽåããããŸãã
åçãªããžã§ã¯ããç¬èªã®ã»ãã³ãã£ã¯ã¹ãå®è£ ããã¡ã«ããºã ã¯ãå®è£ å®çŸ©ã§ãã æå®ãããã€ã³ã¿ãŒãã§ã€ã¹ (åã³å®è£ å®çŸ©) ã¯ãç¹å¥ãªã»ãã³ãã£ã¯ã¹ãããããšã C# ã©ã³ã¿ã€ã ã«éç¥ããããã«ãåçãªããžã§ã¯ãã«ãã£ãŠå®è£ ãããŸãã ãããã£ãŠãåçãªããžã§ã¯ãã«å¯ŸããæŒç®ãåçã«ãã€ã³ãããããã³ã«ããã®ä»æ§ã§æå®ãããŠãã C# ã§ã¯ãªããç¬èªã®ãã€ã³ã ã»ãã³ãã£ã¯ã¹ãåŒãç¶ãããã
åçãã€ã³ãã£ã³ã°ã®ç®çã¯åçãªããžã§ã¯ããšã®çžäºéçšãèš±å¯ããããšã§ãããC# ã§ã¯ãåçãã©ããã«é¢ä¿ãªãããã¹ãŠã®ãªããžã§ã¯ãã«å¯ŸããŠåçãã€ã³ãã£ã³ã°ãèš±å¯ããŸãã ããã«ãããåçãªããžã§ã¯ãã«å¯Ÿããæäœã®çµæã¯åžžã«åçãªããžã§ã¯ãã§ã¯ãªããã³ã³ãã€ã«æã«ããã°ã©ãã«ã¯ãŸã äžæãªåã«ãªã£ãŠãããããåçãªããžã§ã¯ããããã¹ã ãŒãºã«çµ±åã§ããŸãã ãŸããåçãã€ã³ãã£ã³ã°ã¯ãé¢ä¿ãããªããžã§ã¯ããåçãªããžã§ã¯ãã§ãªãå Žåã§ãããšã©ãŒãçºçãããããªãã¬ã¯ã·ã§ã³ ããŒã¹ã®ã³ãŒããæé€ããã®ã«åœ¹ç«ã¡ãŸãã
12.3.4 éšååŒã®å
æŒç®ãéçã«ãã€ã³ããããŠããå ŽåãéšååŒã®å (åä¿¡è ãåŒæ°ãã€ã³ããã¯ã¹ããªãã©ã³ããªã©) ã¯ãåžžã«ãã®åŒã®ã³ã³ãã€ã«æã®åãšèŠãªãããŸãã
æŒç®ãåçã«ãã€ã³ããããŠããå ŽåãéšååŒã®åã¯ãéšååŒã®ã³ã³ãã€ã«æã®åã«å¿ããŠç°ãªãæ¹æ³ã§æ±ºå®ãããŸãã
- ã³ã³ãã€ã«æå dynamic ã®éšååŒã¯ãåŒãå®è¡æã«è©äŸ¡ããå®éã®å€ã®åãæã€ãšèŠãªãããŸã
- ã³ã³ãã€ã«æã®åãåãã©ã¡ãŒã¿ãŒã§ããéšååŒã¯ãå®è¡æã«åãã©ã¡ãŒã¿ãŒããã€ã³ããããåãæã€ãšèŠãªãããŸã
- ãã以å€ã®å ŽåãéšååŒã¯ã³ã³ãã€ã«æã®åãšãããŸãã
12.4 ãªãã¬ãŒã¿ãŒ
12.4.1 å šè¬
åŒã¯ããªãã©ã³ããšæŒç®åã§æ§æãããŸãã åŒã®æŒç®åã¯ããªãã©ã³ãã«é©çšããæŒç®ã衚ããŸãã
äŸ: æŒç®åã®äŸãšããŠã
+ã-ã*ã/ãããã³newãªã©ããããŸãã ãªãã©ã³ãã®äŸãšããŠã¯ããªãã©ã«ããã£ãŒã«ããããŒã«ã«å€æ°ãåŒãªã©ããããŸãã çµäºãµã³ãã«
æŒç®åã«ã¯ 次ã®ãã㪠3 çš®é¡ããããŸãã
- åé
æŒç®åã åé
æŒç®å㯠1 ã€ã®ãªãã©ã³ããåãåãããã¬ãã£ãã¯ã¹è¡šèš (
âxãªã©) ãŸãã¯åŸçœ®è¡šèš (x++ãªã©) ã䜿çšããŸãã - äºé
æŒç®åã äºé
æŒç®å㯠2 ã€ã®ãªãã©ã³ããåãåãããã¹ãŠ infix è¡šèš (
x + yãªã©) ã䜿çšããŸãã - äžé
æŒç®åã 1 ã€ã®äžé
æŒç®å (
?:) ã®ã¿ãååšããŸãã3 ã€ã®ãªãã©ã³ããåãåããã€ã³ãã£ãã¯ã¹è¡šèš (c ? x : y) ã䜿çšããŸãã
åŒå ã®æŒç®åã®è©äŸ¡é åºã¯ãæŒç®åã® åªå é äœ ãš ã®çµåæ§ ã«ãã£ãŠæ±ºãŸããŸã (§12.4.2)ã
åŒã®ãªãã©ã³ãã¯ãå·Šããå³ã«è©äŸ¡ãããŸãã
äŸ:
F(i) + G(i++) * H(i)ã§ã¯ãã¡ãœããFã¯iã®å€ãå€ã䜿çšããŠåŒã³åºãããã¡ãœããGã¯iã®å€ãå€ã§åŒã³åºãããæåŸã«ã¡ãœããHã¯æ°ããå€ i ã§åŒã³åºãããŸãã ããã¯ãæŒç®åã®åªå é äœãšã¯å¥ã§ãããé¢é£æ§ããããŸããã çµäºãµã³ãã«
ç¹å®ã®æŒç®åã¯ããªãŒããŒããŒããããããšãã§ããŸãã æŒç®åããªãŒããŒããŒã (§12.4.3) ãããšããŠãŒã¶ãŒå®çŸ©æŒç®åã®å®è£ ãã1 ã€ãŸãã¯äž¡æ¹ã®ãªãã©ã³ãããŠãŒã¶ãŒå®çŸ©ã®ã¯ã©ã¹ãŸãã¯æ§é äœåã§ããæŒç®åã«æå®ããããšãã§ããŸãã
12.4.2 æŒç®åã®åªå é äœãšçµåèŠå
åŒã«è€æ°ã®æŒç®åãå«ãŸããŠããå ŽåãæŒç®åã® "åªå é äœ" ã«ãã£ãŠãåã ã®æŒç®åãè©äŸ¡ããé åºãå¶åŸ¡ãããŸãã
泚: ããšãã°ãåŒ
x + y * zã®è©äŸ¡ã¯x + (y * z)ã§ãããããã¯*æŒç®åã+æŒç®åããé«ãåªå é äœã ããã§ãã æ³šé
æŒç®åã®åªå é äœã¯ãé¢é£ä»ããããŠããææ³ãããã¯ã·ã§ã³ã®å®çŸ©ã«ãã£ãŠæ±ºå®ãããŸãã
泚: ããšãã°ã additive_expression ã¯ã ãŸãã¯
+æŒç®åã§åºåãããäžé£ã®-ã§æ§æãããŠããããã+ããã³-æŒç®åã®åªå é äœã¯*ã/ãããã³%æŒç®åãããäœããªããŸãã æ³šé
泚: 次ã®è¡šã¯ããã¹ãŠã®æŒç®åãåªå é äœã®é«ãé ã«ãŸãšãããã®ã§ãã
ãµãç¯ ã«ããŽãª æŒç®å §12.8 äž»èŠ x.yx?.yf(x)a[x]a?[x]x++x--x!newtypeofdefaultcheckeduncheckeddelegatestackalloc§12.9 åé æŒç®å +-!x~^++x--x(T)xawait x§12.11 ç¯å² ..§12.12 ã¹ã€ãã switch { ⊠}§12.13 乿³ */%§12.13 å æ³ +-§12.14 ã·ãã <<>>>>>§12.15 é¢ä¿åŒãšåæ€æ» <><=>=isas§12.15 ç䟡æ¯èŒ ==!=§12.16 è«çç© &§12.16 è«ç XOR ^§12.16 è«çå \|§12.17 æ¡ä»¶ä»ã AND &&§12.17 æ¡ä»¶ OR \|\|§12.18 ãã㳠§12.19 null åäœãš throw åŒ ??throw x§12.21 æ¡ä»¶ä»ã ?:§12.24 ãã㳠§12.22 ä»£å ¥ãšã©ã ãåŒ == ref*=/=%=+=-=<<=>>=>>>=&=^=\|==>??=泚é
1 ã€ã®ãªãã©ã³ããåãåªå é äœãæã€ 2 ã€ã®æŒç®åã®éã§çºçããå ŽåãæŒç®åã® çµåæ§ ã«ãã£ãŠæŒç®ãå®è¡ãããé åºã決å®ãããŸãã
- 代å
¥æŒç®åãç¯å²æŒç®åãããã³ null åäœæŒç®åãé€ãããã¹ãŠã®äºé
æŒç®åã¯ å·Šé£æ³ã§ãããæäœã¯å·Šããå³ã«å®è¡ãããŸãã
äŸ:
x + y + zã¯(x + y) + zãšè©äŸ¡ãããŸãã çµäºãµã³ãã« - 代å
¥æŒç®åãnull åäœæŒç®åããã³æ¡ä»¶æŒç®å (
?:) ã¯ãå³çµåã§ããã€ãŸããæŒç®åã¯ãå³ããå·Šã«å®è¡ãããŸããäŸ:
x = y = zã¯x = (y = z)ãšè©äŸ¡ãããŸãã çµäºãµã³ãã« - ç¯å²æŒç®å㯠é¢é£ä»ããããŸãããã€ãŸããç¯å²æŒç®åã®å·Šãªãã©ã³ããå³ãªãã©ã³ãã range_expressionããããšã¯ã§ããŸããã
äŸ:
x..y..zãšx..(y..z)ã®äž¡æ¹ãç¡å¹ã§ãã..ã¯é¢é£ä»ããããŸããã çµäºãµã³ãã«
åªå é äœãšçµåæ§ã¯ããã£ãã䜿çšããŠå¶åŸ¡ããããšãã§ããŸãã
äŸ:
x + y * zã¯æåã«yãšzãæãç®ããxã«çµæãè¶³ããŸããã(x + y) * zã¯ããŸãxãšyãè¶³ããŠãããã®çµæãšzãæãç®ããŸãã çµäºãµã³ãã«
12.4.3 æŒç®åã®ãªãŒããŒããŒã
åé æŒç®åãšäºé æŒç®åã«ã¯ããã¹ãŠå®çŸ©æžã¿ã®å®è£ ããããŸãã ããã«ãã¯ã©ã¹ãšæ§é äœã«æŒç®åå®£èš (§15.10) ãå«ããããšã§ããŠãŒã¶ãŒå®çŸ©ã®å®è£ ãå°å ¥ã§ããŸãã ãŠãŒã¶ãŒå®çŸ©æŒç®åã®å®è£ ã¯ãåžžã«å®çŸ©æžã¿ã®æŒç®åå®è£ ãããåªå ãããŸãã該åœãããŠãŒã¶ãŒå®çŸ©æŒç®åã®å®è£ ãååšããªãå Žåã«ã®ã¿ã §12.4.4 ãã㳠§12.4.5ã§èª¬æãããŠããããã«ãå®çŸ©æžã¿ã®æŒç®åã®å®è£ ãèæ ®ãããŸãã
ãªãŒããŒããŒãå¯èœãªåé æŒç®åã¯æ¬¡ã®ãšããã§ãã
+ - !(è«çåŠå®ã®ã¿)~ ++ -- true false
ãªãŒããŒããŒãã§ããã®ã¯ãäžèšã®æŒç®åã ãã§ãã ç¹ã«ãnull ã蚱容ããæŒç®å (åŸçœ® !ã §12.8.9) ãŸãã¯åé
ã€ã³ããã¯ã¹ã® from-end æŒç®å (ãã¬ãã£ãã¯ã¹ ^ã(§12.9.6)) ããªãŒããŒããŒãããããšã¯ã§ããŸããã
泚:
trueãšfalseã¯åŒã§æç€ºçã«äœ¿çšãããŸãã (ãããã£ãŠ ã§12.4.2 ã®åªå é äœããŒãã«ã«ã¯å«ãŸããŸãã)ãããŒã«åŒ (§12.27) ãšæ¡ä»¶ (§12.21) ãšæ¡ä»¶ä»ãè«çæŒç®å (§12.17) ãå«ãåŒ) ã§åŒã³åºããããããæŒç®åãšèŠãªãããŸãã æ³šé
ãªãŒããŒããŒãå¯èœãªäºé æŒç®åã¯æ¬¡ã®ãšããã§ãã
+ - * / % & | ^ << >> >>> == != > < <= >=
ãªãŒããŒããŒãã§ããã®ã¯ãäžèšã®æŒç®åã ãã§ãã ç¹ã«ãã¡ã³ã㌠ã¢ã¯ã»ã¹ãã¡ãœããåŒã³åºãããŸã㯠..ã =ã &&ã ||ã ??ã ?:ã =>ã checkedã uncheckedã newã typeofã defaultã asãããã³ is æŒç®åããªãŒããŒããŒãããããšã¯ã§ããŸããã
2é æŒç®åããªãŒããŒããŒããããšã察å¿ããè€åä»£å ¥æŒç®åãååšããã°ããããæé»çã«ãªãŒããŒããŒããããŸãã
äŸ: æŒç®å
*ã®ãªãŒããŒããŒãã¯ãæŒç®å*=ã®ãªãŒããŒããŒãã§ããããŸãã ããã«ã€ããŠã¯ã §12.24 ã§è©³ãã説æããŸãã çµäºãµã³ãã«
代å
¥æŒç®åããèªäœ (=) ã¯ãªãŒããŒããŒãã§ããŸããã 代å
¥ã¯åžžã«ã倿° (§12.24.2) ãžã®å€ã®åçŽãªæ ŒçŽãå®è¡ããŸãã
(T)xãªã©ã®ãã£ã¹ãæŒç®ã¯ããŠãŒã¶ãŒå®çŸ©ã®å€æ (§10.5) ãæäŸããããšã«ãã£ãŠãªãŒããŒããŒããããŸãã
泚: ãŠãŒã¶ãŒå®çŸ©ã®å€æã¯ã
isæŒç®åãŸãã¯asæŒç®åã®åäœã«ã¯åœ±é¿ããŸããã æ³šé
a[x] ãªã©ã®èŠçŽ ãžã®ã¢ã¯ã»ã¹ã¯ããªãŒããŒããŒãå¯èœãªæŒç®åãšã¯èŠãªãããŠããŸããã 代ããã«ãã€ã³ãã¯ãµãŒ (§15.9) ã䜿çšããŠãŠãŒã¶ãŒå®çŸ©ã€ã³ããã¯ã¹äœæããµããŒããããŸãã
åŒã§ã¯ãæŒç®åã¯æŒç®å衚èšã䜿çšããŠåç
§ããã宣èšã§ã¯é¢æ°å衚èšã䜿çšããŠæŒç®åãåç
§ãããŸãã æ¬¡ã®è¡šã¯ãåé
æŒç®åãšäºé
æŒç®åã®æŒç®åãšé¢æ°è¡šèšã®é¢ä¿ã瀺ããŠããŸãã æåã®ãšã³ããªã§ã¯ã«op» ã¯ãªãŒããŒããŒãå¯èœãªåé
ãã¬ãã£ãã¯ã¹æŒç®åã衚ããŸãã 2 çªç®ã®ãšã³ããªã§ã¯ã«op» ã¯åé
åŸçœ® ++ ããã³ -- æŒç®åã衚ããŸãã 3 çªç®ã®ãšã³ããªã§ã¯ã«op» ã¯ãªãŒããŒããŒãå¯èœãªãã€ããªæŒç®åã衚ããŸãã
泚:
++æŒç®åãš--æŒç®åããªãŒããŒããŒãããäŸã«ã€ããŠã¯ã §15.10.2ãåç §ããŠãã ããã æ³šé
| æŒç®åè¡šèš | æ©èœè¡šèš |
|---|---|
«op» x |
operator «op»(x) |
x «op» |
operator «op»(x) |
x «op» y |
operator «op»(x, y) |
ãŠãŒã¶ãŒå®çŸ©ã®æŒç®å宣èšã§ã¯ãåžžã«å°ãªããšã 1 ã€ã®ãã©ã¡ãŒã¿ãŒããæŒç®å宣èšãå«ãã¯ã©ã¹ãŸãã¯æ§é äœåã§ããå¿ èŠããããŸãã
泚æ: ãããã£ãŠããŠãŒã¶ãŒå®çŸ©æŒç®åãå®çŸ©æžã¿ã®æŒç®åãšåãã·ã°ããã£ãæã€ããšã¯ã§ããŸããã æ³šé
ãŠãŒã¶ãŒå®çŸ©æŒç®åã®å®£èšã§ã¯ãæŒç®åã®æ§æãåªå é äœããŸãã¯çµåèŠåã倿Žã§ããŸããã
äŸ:
/æŒç®åã¯åžžã« 2 é æŒç®åã§ããã垞㫠§12.4.2ã§æå®ãããåªå é äœã¬ãã«ãæã¡ãåžžã«å·Šãã飿³ãããŸãã çµäºãµã³ãã«
泚: ãŠãŒã¶ãŒå®çŸ©æŒç®åãä»»æã®èšç®ãå®è¡ããããšã¯å¯èœã§ãããçŽæçã«æåŸ ãããçµæä»¥å€ãçæããå®è£ ã¯åŒ·ãæšå¥šãããŸããã ããšãã°ãæŒç®å
==ã®å®è£ ã§ã¯ã2 ã€ã®ãªãã©ã³ãã®ç䟡æ§ãæ¯èŒããé©åãªboolçµæãè¿ãå¿ èŠããããŸãã æ³šé
§12.9 ãã §12.24 ã®åã ã®æŒç®åã®èª¬æã§ã¯ãæŒç®åã®å®çŸ©æžã¿ã®å®è£ ãšãåæŒç®åã«é©çšããã远å ã®èŠåãæå®ããŸãã ãã®èª¬æã§ã¯ã åé æŒç®åãªãŒããŒããŒã解決çšèªã äºé æŒç®åãªãŒããŒããŒãè§£æ±ºã æ°å€ææ Œãããã³æ¬¡ã®ãµãã¯ã©ãŠã¹ã«å«ãŸãããªããæŒç®åå®çŸ©ã䜿çšããŸãã
12.4.4 åé æŒç®åãªãŒããŒããŒãã®è§£æ±º
ãã©ãŒã «op» x ãŸã㯠x «opÂ»ã®æŒç® ã«op» ã¯ãªãŒããŒããŒãå¯èœãªåé
æŒç®åã§ã x 㯠Xåã®åŒã§ãããæ¬¡ã®ããã«åŠçãããŸãã
- æŒç®
Xã®operator «op»(x)ã«ãã£ãŠæäŸãããåè£ãŠãŒã¶ãŒå®çŸ©æŒç®åã®ã»ããã¯ã §12.4.6ã®èŠåã䜿çšããŠæ±ºå®ãããŸãã - åè£ã®ãŠãŒã¶ãŒå®çŸ©æŒç®åã®ã»ããã空ã§ãªãå Žåãããã¯æŒç®ã®åè£æŒç®åã®ã»ããã«ãªããŸãã ãã以å€ã®å Žåãå®çŸ©æžã¿ã®åé
operator «op»å®è£ (ãªããããããã©ãŒã ãå«ã) ããæäœã®åè£æŒç®åã®ã»ããã«ãªããŸãã ç¹å®ã®æŒç®åã®å®çŸ©æžã¿ã®å®è£ ã¯ãæŒç®åã®èª¬æã§æå®ãããŸãã åæåãŸãã¯ããªã²ãŒãåã«ãã£ãŠæäŸãããå®çŸ©æžã¿ã®æŒç®åã¯ããã€ã³ãã£ã³ã°æå (null 蚱容åã®å Žåã¯åºã«ãªãå) ãåæåãŸãã¯ããªã²ãŒãåã§ããå Žåã«ã®ã¿ããã®ã»ããã«å«ãŸããŸãã -
§12.6.4 ã®ãªãŒããŒããŒã解決èŠåã¯ãåŒæ°ãªã¹ã
(x)ã«é¢ããŠæé©ãªæŒç®åãéžæããåè£æŒç®åã®ã»ããã«é©çšããããã®æŒç®åã¯ãªãŒããŒããŒã解決ããã»ã¹ã®çµæã«ãªããŸãã ãªãŒããŒããŒãã®è§£æ±ºã§æé©ãªæŒç®åã 1 ã€éžæã§ããªãå Žåã¯ããã€ã³ãæãšã©ãŒãçºçããŸãã
12.4.5 äºé æŒç®åãªãŒããŒããŒãã®è§£æ±º
ãã©ãŒã x «op» yã®æŒç® ã«op» ã¯ãªãŒããŒããŒãå¯èœãª 2 é
æŒç®åã§ã x 㯠Xåã®åŒã§ããã y 㯠Yåã®åŒã§ãããæ¬¡ã®ããã«åŠçãããŸãã
- æŒç®
Xã®Yãšoperator «op»(x, y)ã«ãã£ãŠæäŸãããåè£ãŠãŒã¶ãŒå®çŸ©æŒç®åã®ã»ãããæ±ºå®ãããŸãã ã»ããã¯ãXã«ãã£ãŠæäŸãããåè£æŒç®åã®åéåã§æ§æãããæŒç®åãã·ããæŒç®åã§ãªãéããYã«ãã£ãŠæäŸãããåè£æŒç®åã¯ããããã §12.4.6 ã®èŠåã䜿çšããŠæ±ºå®ãããŸãã çµåã»ããã®å Žåãåè£ã¯æ¬¡ã®ããã«ããŒãžãããŸãã-
XãšYã ID 倿å¯èœãªå ŽåããŸãã¯XãšYãå ±éã®åºæ¬åããæŽŸçããŠããå Žåãå ±æåè£æŒç®åã¯çµåã»ããå ã§ 1 åã ãçºçããŸãã -
XãšYã®éã« ID 倿ãããå Žåã«op»Yã«ãã£ãŠæäŸãããæŒç®åYã¯ã«op»Xã«ãã£ãŠæäŸãããXãšåãæ»ãå€ã®åãæã¡ã«op»Yã®ãªãã©ã³ãåã¯ã«op»Xã®å¯Ÿå¿ãããªãã©ã³ãåãžã® ID 倿ãæã€å Žåãã»ããå ã§Â«op»Xã®ã¿ãçºçããŸãã
-
- åè£ã®ãŠãŒã¶ãŒå®çŸ©æŒç®åã®ã»ããã空ã§ãªãå Žåãããã¯æŒç®ã®åè£æŒç®åã®ã»ããã«ãªããŸãã ãã以å€ã®å Žåãå®çŸ©æžã¿ã®ãã€ããª
operator «op»å®è£ (ãªããããããã©ãŒã ãå«ã) ããæŒç®ã®åè£æŒç®åã®ã»ããã«ãªããŸãã ç¹å®ã®æŒç®åã®å®çŸ©æžã¿ã®å®è£ ã¯ãæŒç®åã®èª¬æã§æå®ãããŸãã å®çŸ©æžã¿ã®åæåããã³ããªã²ãŒãæŒç®åã®å Žåãèæ ®ãããæŒç®åã¯ãããããã®ãªãã©ã³ãã®ãã€ã³ãæåã§ããåæåãŸãã¯ããªã²ãŒãåã«ãã£ãŠæäŸãããæŒç®åã®ã¿ã§ãã -
§12.6.4 ã®ãªãŒããŒããŒã解決èŠåã¯ãåŒæ°ãªã¹ã
(x, y)ã«é¢ããŠæé©ãªæŒç®åãéžæããåè£æŒç®åã®ã»ããã«é©çšããããã®æŒç®åã¯ãªãŒããŒããŒã解決ããã»ã¹ã®çµæã«ãªããŸãã ãªãŒããŒããŒãã®è§£æ±ºã§æé©ãªæŒç®åã 1 ã€éžæã§ããªãå Žåã¯ããã€ã³ãæãšã©ãŒãçºçããŸãã
12.4.6 ãŠãŒã¶ãŒå®çŸ©æŒç®ååè£
å T ãšæŒç® operator «op»(A)(«op» ã¯ãªãŒããŒããŒãå¯èœãªæŒç®åã A ã¯åŒæ°ãªã¹ã) ãæå®ãããšãæŒç®å T 㮠«op»(A) ã«ãã£ãŠæäŸãããåè£ãŠãŒã¶ãŒå®çŸ©æŒç®åã®ã»ããã¯æ¬¡ã®ããã«æ±ºå®ãããŸãã
-
Tâåãæ±ºå®ããŸããTã null 蚱容å€åã®å ŽåãTâã¯ãã®åºã«ãªãåã§ãããã以å€ã®å ŽåãTâã¯TãšçãããªããŸãã - ãŠãŒã¶ãŒå®çŸ©æŒç®åã®ã»ãã (
U) ãæ€çŽ¢ããŸãã ãã®ã»ããã¯æ¬¡ã§æ§æãããŸãã-
uncheckedè©äŸ¡ã³ã³ããã¹ãã§ã¯ãoperator «op»ã®ãã¹ãŠã®éåžžã®Tâ宣èšã -
checkedè©äŸ¡ã³ã³ããã¹ãã§ã¯ããã§ãã¯ãããæŒç®å宣èšããã¢ã¯ã€ãºäžèŽããéåžžã®å®£èšãé€ããTâ(§15.10.1 ãåç §) å ã®ãã¹ãŠã®ãã§ãã¯æžã¿ããã³éåžžã®operator «op»宣èšã
-
-
operator «op»å ã®ãã¹ãŠã®Tâ宣èšãšãã®ãããªæŒç®åã®ãã¹ãŠã®ãªããããã圢åŒã«ã€ããŠãåŒæ°ãªã¹ã ã«é¢ããŠå°ãªããšã1ã€ã®æŒç®åãé©çšå¯èœïŒAïŒã§ããå Žåãåè£æŒç®åã®éåã¯Tâå ã®ãã¹ãŠã®ãã®ãããªé©çšå¯èœãªæŒç®åããæ§æãããŸãã - ãã以å€ã®å Žåã
Tâãobjectå Žåãåè£ã®æŒç®åã®ã»ããã¯ç©ºã«ãªããŸãã - ãã以å€ã®å Žåã
Tâã«ãã£ãŠæäŸãããåè£æŒç®åã®ã»ããã¯ãTâã®çŽæ¥åºåºã¯ã©ã¹ã«ãã£ãŠæäŸãããåè£æŒç®åã®ã»ããããŸãã¯Tâãåãã©ã¡ãŒã¿ãŒã®å Žåã¯Tâã®æå¹ãªåºåºã¯ã©ã¹ã§ãã
12.4.7 æ°å€ææ Œ
12.4.7.1 å šè¬
ãã®ãµãã¯ã©ã¹ã¯æçã§ãã
§12.4.7 ãšãã®ãµãã¯ã©ãŠã¹ã¯ã次ã®å¹æã®çµã¿åããã®æŠèŠã§ãã
- æé»çãªæ°å€å€æã®èŠå (§10.2.3);
- ããè¯ã倿ã®ããã®ã«ãŒã« (§12.6.4.7);ãããŠ
- 䜿çšã§ããç®è¡æŒç®å (§12.13)ããªã¬ãŒã·ã§ãã«æŒç®å (§12.15)ãããã³æŽæ°è«çæŒç®å (§12.16.2)ã
æ°å€ã®ææ Œã¯ãå®çŸ©æžã¿ã®åé ããã³äºé æ°å€æŒç®åã®ãªãã©ã³ãã®ç¹å®ã®æé»çãªå€æãèªåçã«å®è¡ããããšã§æ§æãããŸãã æ°å€ã®ææ Œã¯ãæç¢ºãªã¡ã«ããºã ã§ã¯ãªããå®çŸ©æžã¿ã®æŒç®åã«ãªãŒããŒããŒã解決ãé©çšãã广ã§ãã æ°å€ã®ææ Œã¯ãç¹ã«ãŠãŒã¶ãŒå®çŸ©æŒç®åã®è©äŸ¡ã«ã¯åœ±é¿ããŸããããåæ§ã®å¹æã瀺ãããã«ãŠãŒã¶ãŒå®çŸ©æŒç®åãå®è£ ã§ããŸãã
æ°å€ã®ææ Œã®äŸãšããŠãäºé
* æŒç®åã®å®çŸ©æžã¿ã®å®è£
ãèããŠã¿ãŸãããã
int operator *(int x, int y);
uint operator *(uint x, uint y);
nint operator *(nint x, nint y);
nuint operator *(nuint x, nuint y);
long operator *(long x, long y);
ulong operator *(ulong x, ulong y);
float operator *(float x, float y);
double operator *(double x, double y);
decimal operator *(decimal x, decimal y);
ãªãŒããŒããŒã解決èŠå (§12.6.4) ããã®äžé£ã®æŒç®åã«é©çšãããŠããå Žåããªãã©ã³ãåããæé»çãªå€æãååšããæåã®æŒç®åãéžæããŸãã
äŸ: æŒç®
b * sã®å Žåãbã¯byteãsã¯shortã§ããªãŒããŒããŒãã®è§£æ±ºã§ã¯æé©ãªæŒç®åãšããŠoperator *(int, int)ãéžæãããŸãã ãããã£ãŠãbãšsãintã«å€æãããçµæã®åãintãããŸãã åæ§ã«ãi * dãiã§ãintãdã§ããæŒç®doubleã®å Žåãoverloadè§£ååºŠã¯æé©ãªæŒç®åãšããŠoperator *(double, double)ãéžæããŸãã çµäºãµã³ãã«
æ å ±ããã¹ãã®æ«å°Ÿã
12.4.7.2 åé æ°å€ææ Œ
ãã®ãµãã¯ã©ã¹ã¯æçã§ãã
åé
æ°å€ã®ææ Œã¯ãå®çŸ©æžã¿ã® +ã -ãããã³ ~ åé
æŒç®åã®ãªãã©ã³ãã«å¯ŸããŠè¡ãããŸãã åé
æ°å€ã®ææ Œã¯ãå sbyteã byteã shortã ushortããŸã㯠char ã®ãªãã©ã³ããå intã«å€æããã ãã§æ§æãããŸãã ããã«ãåé
- æŒç®åã®å Žåãåé
æ°å€ææ Œã§ã¯ã uint åã®ãªãã©ã³ããå longã«å€æãããŸãã
æ å ±ããã¹ãã®æ«å°Ÿã
12.4.7.3 2 é æ°å€ææ Œ
ãã®ãµãã¯ã©ã¹ã¯æçã§ãã
äºé
æ°å€ã®ææ Œã¯å®çŸ©æžã¿ã® +ã -ã *ã /ã %ã &ã |ã ^ã ==ã !=ã >ã <ã >=ã ããã³ <= äºé
æŒç®åã®ãªãã©ã³ãã«å¯ŸããŠè¡ãããŸãã äºé
æ°å€ææ Œã¯ãäž¡æ¹ã®ãªãã©ã³ããå
±éã®åã«æé»çã«å€æããŸããéé¢ä¿æŒç®åã®å Žåã¯ãæŒç®ã®çµæåã«ããªããŸãã ãã€ããªæ°å€ã®ææ Œã¯ã次ã®èŠåãããã«è¡šç€ºãããé åºã§é©çšããããšã§æ§æãããŸãã
- ããããã®ãªãã©ã³ãã
decimalåã®å Žåãããäžæ¹ã®ãªãã©ã³ãã¯ådecimalã«å€æãããŸãããŸãã¯ãããäžæ¹ã®ãªãã©ã³ããfloatåãŸãã¯doubleã®å Žåããã€ã³ãã£ã³ã°æãšã©ãŒãçºçããŸãã - ãããã¯ãã©ã¡ããã®ãªãã©ã³ãã
doubleåã®å Žåãããäžæ¹ã®ãªãã©ã³ãã¯doubleåã«å€æãããŸãã - ãããã¯ãã©ã¡ããã®ãªãã©ã³ãã
floatåã®å Žåãããäžæ¹ã®ãªãã©ã³ãã¯floatåã«å€æãããŸãã - ãã以å€ã®å Žåãããããã®ãªãã©ã³ãã
ulongåã®å Žåãããäžæ¹ã®ãªãã©ã³ãã¯åulongã«å€æãããŸãããŸãã¯ãããäžæ¹ã®ãªãã©ã³ããåsbyteãshortãintãnintããŸãã¯longã®å Žåããã€ã³ãæãšã©ãŒãçºçããŸãã - ãã以å€ã®å Žåãããããã®ãªãã©ã³ãã
nuintåã®å Žåãããäžæ¹ã®ãªãã©ã³ãã¯ånuintã«å€æãããŸãããŸãã¯ãããäžæ¹ã®ãªãã©ã³ããåsbyteãshortãintãnintããŸãã¯longã®å Žåããã€ã³ãæãšã©ãŒãçºçããŸãã - ãããã¯ãã©ã¡ããã®ãªãã©ã³ãã
longåã®å Žåãããäžæ¹ã®ãªãã©ã³ãã¯longåã«å€æãããŸãã - ãã以å€ã®å Žåãããããã®ãªãã©ã³ãã
uintåã§ãããäžæ¹ã®ãªãã©ã³ããåsbyteãshortãintããŸãã¯nintã®å Žåãäž¡æ¹ã®ãªãã©ã³ããålongã«å€æãããŸãã - ãããã¯ãã©ã¡ããã®ãªãã©ã³ãã
uintåã®å Žåãããäžæ¹ã®ãªãã©ã³ãã¯uintåã«å€æãããŸãã - ãããã¯ãã©ã¡ããã®ãªãã©ã³ãã
nintåã®å Žåãããäžæ¹ã®ãªãã©ã³ãã¯nintåã«å€æãããŸãã - ãã以å€ã®å Žåãäž¡æ¹ã®ãªãã©ã³ããå
intã«å€æãããŸãã
泚æ: æåã®ã«ãŒã«ã§ã¯ã
decimalåãšdoubleåãšfloatåãæ··åšãããæŒç®ã¯èš±å¯ãããŸããã ãã®èŠåã¯ãdecimalåãšdoubleåãšfloatåã®éã«æé»çãªå€æãååšããªããšããäºå®ã«åŸããŸãã æ³šé
泚: ããäžæ¹ã®ãªãã©ã³ãã笊å·ä»ãæŽæ°åã®å Žåããªãã©ã³ãã
ulongåã«ãªãããšã¯ã§ããªãããšã«æ³šæããŠãã ããã ãã®çç±ã¯ã笊å·ä»ãæŽæ°åã ãã§ãªããulongã®å šç¯å²ã衚ãããšãã§ããæŽæ°åãååšããªãããã§ãã æ³šé
äžèšã®ã©ã¡ãã®å Žåãããã£ã¹ãåŒã䜿çšããŠãäžæ¹ã®ãªãã©ã³ãããããäžæ¹ã®ãªãã©ã³ããšäºææ§ã®ããåã«æç€ºçã«å€æã§ããŸãã
äŸ: 次ã®ã³ãŒãäŸã®å 容:
decimal AddPercent(decimal x, double percent) => x * (1.0 + percent / 100.0);
decimalã«doubleãä¹ç®ã§ããªãããããã€ã³ãæãšã©ãŒãçºçããŸãã ãšã©ãŒã¯ã次ã®ããã« 2 çªç®ã®ãªãã©ã³ããdecimalã«æç€ºçã«å€æããããšã§è§£æ±ºãããŸããdecimal AddPercent(decimal x, double percent) => x * (decimal)(1.0 + percent / 100.0);çµäºãµã³ãã«
æ å ±ããã¹ãã®æ«å°Ÿã
12.4.8 ãªããæŒç®å
ãªããæŒç®åã䜿çšãããšãnull é蚱容å€åã§åäœããå®çŸ©æžã¿ã®æŒç®åãšãŠãŒã¶ãŒå®çŸ©æŒç®åãããã®åã® null 蚱容圢åŒã§ã䜿çšã§ããŸãã ãªããæŒç®åã¯ã次ã«ç€ºãããã«ãç¹å®ã®èŠä»¶ãæºããå®çŸ©æžã¿ããã³ãŠãŒã¶ãŒå®çŸ©ã®æŒç®åããæ§ç¯ãããŸãã
- åé
æŒç®å
+ã++ã-ã--ã!(è«çåŠå®)ã^ãããã³~ã®å Žåããªãã©ã³ããšçµæã®åã®äž¡æ¹ã null é蚱容å€åã®å Žåããªããããã圢åŒã®æŒç®åãååšããŸãã ãªããããããã©ãŒã ã¯ããªãã©ã³ããšçµæã®åã« 1 ã€ã®?修食åã远å ããããšã«ãã£ãŠæ§ç¯ãããŸãã ãªãã©ã³ããnullã®å ŽåããªãããããæŒç®åã¯nullå€ãçæããŸãã ãã以å€ã®å ŽåããªããæŒç®åã¯ãªãã©ã³ãã®ã©ãããè§£é€ããåºã«ãªãæŒç®åãé©çšããŠçµæãã©ããããŸãã - äºé
æŒç®å
+ã-ã*ã/ã%ã&ã|ã^ã..ã<<ã>>ãããã³>>>ã®å Žåããªãã©ã³ããšçµæã®åããã¹ãŠ null é蚱容å€åã®å Žåããªããããã圢åŒã®æŒç®åãååšããŸãã ãªããããã圢åŒã¯ãåãªãã©ã³ããšçµæã®åã«åäžã®?修食åã远å ããããšã«ãã£ãŠæ§ç¯ãããŸãã äžæ¹ãŸãã¯äž¡æ¹ã®ãªãã©ã³ããnullãããŠããå ŽåããªãããããæŒç®åã¯nullå€ãçæããŸã (&ã§èª¬æãããŠããããã«ã|åã®bool?æŒç®åãšæŒç®åã§ããäŸå€)ã ãã以å€ã®å ŽåããªããæŒç®åã¯ãªãã©ã³ãã®ã©ãããè§£é€ããåºã«ãªãæŒç®åãé©çšããŠçµæãã©ããããŸãã - ç倿Œç®å
==ãš!=ã®å Žåããªãã©ã³ãã®åã null é蚱容å€åã§ãããçµæã®åãboolã®å Žåããªããããã圢åŒã®æŒç®åãååšããŸãã ãªããããããã©ãŒã ã¯ãåãªãã©ã³ãã®åã« 1 ã€ã®?修食åã远å ããããšã«ãã£ãŠæ§ç¯ãããŸãã ãªãããããæŒç®åã§ã¯ã2 ã€ã®nullå€ãçãããnullå€ãnull以å€ã®å€ãšçãããªããšèŠãªãããŸãã äž¡æ¹ã®ãªãã©ã³ããnullã§ãªãå ŽåããªãããããæŒç®åã¯ãªãã©ã³ããã©ããè§£é€ããåºã«ãªãæŒç®åãé©çšããŠboolçµæãçæããŸãã - é¢ä¿æŒç®å
<ã>ã<=ã>=ã®å Žåããªãã©ã³ãã®åãäž¡æ¹ãšã null é蚱容å€åã§ãããçµæã®åãboolãªãããªããããã圢åŒã®æŒç®åãååšããŸãã ãªããããããã©ãŒã ã¯ãåãªãã©ã³ãã®åã« 1 ã€ã®?修食åã远å ããããšã«ãã£ãŠæ§ç¯ãããŸãã ãªãããããæŒç®åã¯ãäžæ¹ãŸãã¯äž¡æ¹ã®ãªãã©ã³ããfalseã®å Žåã«nullå€ãçæããŸãã ãã以å€ã®å ŽåããªãããããæŒç®åã¯ãªãã©ã³ããã©ããè§£é€ããåºã«ãªãæŒç®åãé©çšããŠboolçµæãçæããŸãã
12.5 ã¡ã³ããŒæ€çŽ¢
12.5.1 å šè¬
ã¡ã³ããŒæ€çŽ¢ãšã¯ãåã®ã³ã³ããã¹ãã«ãããååã®æå³ã決å®ãããããã»ã¹ã§ãã ã¡ã³ããŒæ€çŽ¢ã¯ãåŒã® simple_name (§12.8.4) ãŸã㯠member_access (§12.8.7) ã®è©äŸ¡ã®äžç°ãšããŠè¡ãããšãã§ããŸãã simple_name ãŸã㯠member_access ããinvocation_expression (§12.8.10.2) ã® primary_expression ãšããŠçºçããå Žåãã¡ã³ããŒã¯ãinvoked ã§ãããšèããããŠããŸãã
ã¡ã³ããŒãã¡ãœãããŸãã¯ã€ãã³ãã®å ŽåããŸãã¯ããªã²ãŒãå (§21) ãŸãã¯ådynamic (§8.2.4) ã®å®æ°ããã£ãŒã«ãããŸãã¯ããããã£ã§ããå Žåãã¡ã³ããŒã¯ã€ã³ãã«ãã«ãšèšãããŸãã
ã¡ã³ããŒæ€çŽ¢ã§ã¯ãã¡ã³ããŒã®ååã ãã§ãªããã¡ã³ããŒãæã€åãã©ã¡ãŒã¿ãŒã®æ°ãšãã¡ã³ããŒã«ã¢ã¯ã»ã¹ã§ãããã©ãããèæ ®ããŸãã ã¡ã³ããŒæ€çŽ¢ã®ç®çäžããžã§ããªã㯠ã¡ãœãããšå ¥ãåã«ãªã£ããžã§ããªãã¯åã«ã¯ãããããã®å®£èšã§ç€ºãããåãã©ã¡ãŒã¿ãŒã®æ°ãå«ãŸããŠãããä»ã®ãã¹ãŠã®ã¡ã³ããŒã«ã¯ 0 åã®åãã©ã¡ãŒã¿ãŒããããŸãã
å N ã® K ååŒæ°ãããåå T ã®ã¡ã³ããŒæ€çŽ¢ã¯ã以äžã®ããã«åŠçãããŸãã
- ãŸãã
Nãšããååã®ã¢ã¯ã»ã¹å¯èœãªã¡ã³ããŒã®ã»ãããæ±ºå®ãããŸãã-
Tãåãã©ã¡ãŒã¿ã®å Žåãã»ããã¯ãNã®ãã©ã€ããªå¶çŽãŸãã¯ã»ã«ã³ããªå¶çŽ (§15.2.5) ãšããŠæå®ãããååã§Tãšããååã®ã¢ã¯ã»ã¹å¯èœãªã¡ã³ããŒã®ã»ãããšãNã®objectãšããååã®ã¢ã¯ã»ã¹å¯èœãªã¡ã³ããŒã®ã»ããã®åéåã§ãã - ãã以å€ã®å Žåãã»ããã¯ãç¶æ¿ãããã¡ã³ããŒãš
objectã®Nãšããååã®ã¢ã¯ã»ã¹å¯èœãªã¡ã³ããŒãå«ããTã§Nãšããååã®ãã¹ãŠã®ã¢ã¯ã»ã¹å¯èœãª (§7.4) ã¡ã³ããŒã§æ§æãããŸããTãæ§ç¯ãããåã®å Žåãã¡ã³ããŒã®ã»ããã¯ã §15.3.3ã§èª¬æãããŠããããã«ååŒæ°ã眮ãæããããšã«ãã£ãŠååŸãããŸããoverride修食åãå«ãã¡ã³ããŒã¯ãã»ããããé€å€ãããŸãã
-
- 次ã«ã
Kã 0 ã®å Žåã宣èšã«åãã©ã¡ãŒã¿ãŒãå«ãŸããå ¥ãåã«ãªã£ãåã¯ãã¹ãŠåé€ãããŸããKã 0 ã§ãªãå Žåãåãã©ã¡ãŒã¿ãŒã®æ°ãç°ãªãã¡ã³ããŒã¯ãã¹ãŠåé€ãããŸããKã 0 ã®å Žåãåæšè«ããã»ã¹ (§12.6.3) ãååŒæ°ãæšè«ã§ããå¯èœæ§ããããããåãã©ã¡ãŒã¿ãŒãæã€ã¡ãœããã¯åé€ãããŸããã - 次ã«ã ã¡ã³ã㌠åç §ãçºçããŠããåŒãå«ãã³ã³ãã€ã«åäœã F ã«èšå®ããŸãã ãã¡ã€ã« ããŒã«ã«åã§ããã F ã§å®£èšãããŠããªããã¹ãŠã®ã¡ã³ããŒã¯ãã»ããããåé€ãããŸãã
- 次ã«ãã¢ã¯ã»ã¹å¯èœãªã¡ã³ããŒã®ã»ããã«ãã¡ã€ã« ããŒã«ã«åãå«ãŸããŠããå Žåããã¡ã€ã« ããŒã«ã«åã§ã¯ãªããã¹ãŠã®ã¡ã³ããŒãã»ããããåé€ãããŸãã
- 次ã«ãã¡ã³ããŒãåŒã³åºããããšãåŒã³åºãäžå¯èœãªãã¹ãŠã®ã¡ã³ããŒãã»ããããåé€ãããŸãã
- 次ã«ãä»ã®ã¡ã³ããŒã«ãã£ãŠé衚瀺ã«ãªã£ãŠããã¡ã³ããŒãã»ããããåé€ãããŸãã ã»ããå
ã®åã¡ã³ããŒ
S.Mã®å ŽåãSã¯ãã¡ã³ããŒMã宣èšãããŠããåãšãªããæ¬¡ã®èŠåãé©çšãããŸãã-
Mã宿°ããã£ãŒã«ããããããã£ãã€ãã³ãããŸãã¯åæã¡ã³ããŒã®å Žåãåºæ¬åã®Sã§å®£èšãããŠãããã¹ãŠã®ã¡ã³ããŒãã»ããããåé€ãããŸãã -
Mãå宣èšã®å Žåãåºæ¬åã®Sã§å®£èšãããŠãããã¹ãŠã®éåãã»ããããåé€ãããåºæ¬åã®Mã§å®£èšSãšåãæ°ã®åãã©ã¡ãŒã¿ãŒãæã€ãã¹ãŠã®å宣èšãã»ããããåé€ãããŸãã -
Mãã¡ãœããã®å Žåãåºæ¬åã®Sã§å®£èšãããŠãããã¹ãŠã®éã¡ãœãã ã¡ã³ããŒãã»ããããåé€ãããŸãã
-
- 次ã«ãã¯ã©ã¹ ã¡ã³ããŒã«ãã£ãŠé衚瀺ã«ãªã£ãŠããã€ã³ã¿ãŒãã§ã€ã¹ ã¡ã³ããŒãã»ããããåé€ãããŸãã ãã®æé ã¯ã
Tãåãã©ã¡ãŒã¿ãŒã§ãããTã«object以å€ã®æå¹ãªåºåºã¯ã©ã¹ãšç©ºã§ãªãæå¹ãªã€ã³ã¿ãŒãã§ã€ã¹ ã»ãã (§15.2.5) ã®äž¡æ¹ãããå Žåã«ã®ã¿æå¹ã§ãã ãã¹ãŠã®ã¡ã³ããŒS.Mã«å¯ŸããŠãSãã¡ã³ããŒMã宣èšããŠããåã§ããã»ããå ã«ãããŠãSãobject以å€ã®ã¯ã©ã¹å®£èšã§ããå Žåãæ¬¡ã®èŠåãé©çšãããŸãã-
Mã宿°ããã£ãŒã«ããããããã£ãã€ãã³ããåæåã¡ã³ããŒããŸãã¯å宣èšã®å Žåãã€ã³ã¿ãŒãã§ã€ã¹å®£èšã§å®£èšãããŠãããã¹ãŠã®ã¡ã³ããŒãã»ããããåé€ãããŸãã -
Mãã¡ãœããã®å Žåãã€ã³ã¿ãŒãã§ã€ã¹å®£èšã§å®£èšãããŠãããã¹ãŠã®éã¡ãœãã ã¡ã³ããŒãã»ããããåé€ãããã€ã³ã¿ãŒãã§ã€ã¹å®£èšã§å®£èšãããMãšåãã·ã°ããã£ãæã€ãã¹ãŠã®ã¡ãœãããã»ããããåé€ãããŸãã
-
- æåŸã«ãé衚瀺ã®ã¡ã³ããŒãåé€ãããšãæ€çŽ¢ã®çµæã決å®ãããŸãã
- ã»ãããã¡ãœããã§ã¯ãªã 1 ã€ã®ã¡ã³ããŒã§æ§æãããŠããå Žåããã®ã¡ã³ããŒã¯æ€çŽ¢ã®çµæã«ãªããŸãã
- ãã以å€ã®å Žåãã»ããã«ã¡ãœããã®ã¿ãå«ãŸããŠããå Žåããã®ã¡ãœããã®ã°ã«ãŒãã¯æ€çŽ¢ã®çµæã«ãªããŸãã
- ãã以å€ã®å Žåãæ€çŽ¢ããããŸãã«ãªãããã€ã³ãæãšã©ãŒãçºçããŸãã
åãã©ã¡ãŒã¿ãŒãšã€ã³ã¿ãŒãã§ã€ã¹ä»¥å€ã®åã®ã¡ã³ããŒæ€çŽ¢ãšãå³å¯ã«åäžç¶æ¿ã§ããã€ã³ã¿ãŒãã§ã€ã¹ã®ã¡ã³ããŒæ€çŽ¢ (ç¶æ¿ãã§ãŒã³å ã®åã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯ã0 åãŸã㯠1 ã€ã®çŽæ¥åºæ¬ã€ã³ã¿ãŒãã§ã€ã¹ããã) ã®å Žåãæ€çŽ¢èŠåã®å¹æã¯ã掟çã¡ã³ããŒãåãååãŸãã¯ã·ã°ããã£ãæã€åºæ¬ã¡ã³ããŒãé衚瀺ã«ããã ãã§ãã ãã®ãããªã·ã³ã°ã«ç¶æ¿ã«ãã¯ã¢ããã¯ãããŸãã«ãªãããšã¯ãããŸããã å€éç¶æ¿ã€ã³ã¿ãŒãã§ã€ã¹ã®ã¡ã³ããŒåç §ã«ãã£ãŠçããå¯èœæ§ã®ãããããŸããã¯ã §19.4.11 ã§èª¬æãããŠããŸãã
泚: ãã®ãã§ãŒãºã§ã¯ã1 çš®é¡ã®ãããŸããã®ã¿ãèæ ®ãããŸãã ã¡ã³ããŒæ€çŽ¢ã®çµæãã¡ãœãã ã°ã«ãŒãã«å«ãŸããå Žåã¯ã §12.6.4.1 ãã㳠§12.6.6.2ã§èª¬æãããŠããããã«ããããŸããã®ããã«ã¡ãœãã ã°ã«ãŒãã®äœ¿çšãããã«å€±æããå¯èœæ§ããããŸãã æ³šé
12.5.2 åºæ¬ããŒã¿å
ã¡ã³ããŒæ€çŽ¢ã®ç®çã§ã T åã¯æ¬¡ã®åºæ¬åãæã€ãšèŠãªãããŸãã
-
TãobjectãŸãã¯dynamicã®å ŽåãTã¯åºæ¬åãæã£ãŠããŸããã -
Tã enum_typeã®å ŽåãTã®åºæ¬åã¯ãSystem.EnumãSystem.ValueTypeãããã³objectã¯ã©ã¹åã§ãã -
Tã struct_typeã®å ŽåãTã®åºæ¬åã¯ãSystem.ValueTypeããã³objectã¯ã©ã¹åã§ããæ³š: nullable_value_type 㯠struct_type ã§ã (§8.3.1)ã æ³šé
-
Tã class_typeã®å ŽåãTã®åºæ¬åã¯ãã¯ã©ã¹åTãå«ããobjectã®åºåºã¯ã©ã¹ã§ãã -
Tã interface_typeã®å ŽåãTã®åºæ¬åã¯Tã®åºæ¬ã€ã³ã¿ãŒãã§ã€ã¹ã§ãããã¯ã©ã¹åã¯objectã§ãã -
Tã array_typeã®å ŽåãTã®åºæ¬åã¯ãSystem.Arrayãšobjectã¯ã©ã¹åã§ãã -
Tã delegate_typeã®å ŽåãTã®åºæ¬åã¯ãSystem.Delegateããã³objectã¯ã©ã¹åã§ãã
12.6 颿°ã¡ã³ããŒ
12.6.1 å šè¬
颿°ã¡ã³ããŒã¯ãå®è¡å¯èœã¹ããŒãã¡ã³ããå«ãã¡ã³ããŒã§ãã 颿°ã¡ã³ããŒã¯åžžã«åã®ã¡ã³ããŒã§ãããåå空éã®ã¡ã³ããŒã«ããããšã¯ã§ããŸããã C# ã§ã¯ã颿°ã¡ã³ããŒã®æ¬¡ã®ã«ããŽãªãå®çŸ©ãããŠããŸãã
- ã¡ãœãã
- ããããã£
- ã€ãã³ã
- ã€ã³ãã¯ãµãŒ
- ãŠãŒã¶ãŒå®çŸ©æŒç®å
- ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒ
- éçã³ã³ã¹ãã©ã¯ã¿ãŒ
- ãã¡ã€ãã©ã€ã¶ãŒ
ãã¡ã€ãã©ã€ã¶ãŒãšéçã³ã³ã¹ãã©ã¯ã¿ãŒ (æç€ºçã«åŒã³åºãããšãã§ããªã) ãé€ãã颿°ã¡ã³ããŒã«å«ãŸããã¹ããŒãã¡ã³ãã¯é¢æ°ã¡ã³ããŒåŒã³åºãã«ãã£ãŠå®è¡ãããŸãã 颿°ã¡ã³ããŒåŒã³åºããèšè¿°ããããã®å®éã®æ§æã¯ãç¹å®ã®é¢æ°ã¡ã³ã㌠ã«ããŽãªã«ãã£ãŠç°ãªããŸãã
颿°ã¡ã³ããŒåŒã³åºãã®åŒæ°ãªã¹ã (§12.6.2) ã¯ã颿°ã¡ã³ããŒã®ãã©ã¡ãŒã¿ãŒã®å®éã®å€ãŸãã¯å€æ°åç §ãæäŸããŸãã
ãžã§ããªã㯠ã¡ãœããã®åŒã³åºãã§ã¯ãåæšè«ã䜿çšããŠãã¡ãœããã«æž¡ãååŒæ°ã®ã»ãããæ±ºå®ã§ããŸãã ãã®ããã»ã¹ã«ã€ããŠã¯ã $12.6.3ã§èª¬æãããŸãã
ã¡ãœãããã€ã³ãã¯ãµãŒãæŒç®åãããã³ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã®åŒã³åºãã§ã¯ããªãŒããŒããŒã解決ã䜿çšããŠãåŒã³åºã颿°ã¡ã³ããŒã®åè£ã»ãããæ±ºå®ããŸãã ãã®ããã»ã¹ã«ã€ããŠã¯ã $12.6.4ã§èª¬æãããŸãã
ãã€ã³ãã£ã³ã°æã«ç¹å®ã®é¢æ°ã¡ã³ããŒãç¹å®ããããšããããããªãŒããŒããŒã解決ã«ãã£ãŠã颿°ã¡ã³ããŒãåŒã³åºãå®éã®å®è¡æããã»ã¹ã«ã€ããŠã¯ §12.6.6ã§èª¬æããŸãã
泚: 次ã®è¡šã¯ãæç€ºçã«åŒã³åºãããšãã§ãã 6 ã€ã®ã«ããŽãªã®é¢æ°ã¡ã³ããŒãå«ãã³ã³ã¹ãã©ã¯ãã§è¡ãããåŠçããŸãšãããã®ã§ãã 衚äžã®
eãxãyãvalueã¯å€æ°ãŸãã¯å€ãšããŠåé¡ãããåŒãTã¯åãšããŠåé¡ãããåŒãFã¯ã¡ãœããã®åçŽåãPã¯ããããã£ã®åçŽåã瀺ããŸãã
æ§æäœ äŸ èª¬æ ã¡ãœããã®åŒã³åºã F(x, y)ãªãŒããŒããŒãã®è§£æ±ºã¯ãå å«ã¯ã©ã¹ãŸãã¯æ§é äœã§ Fæé©ãªã¡ãœãããéžæããããã«é©çšãããŸãã ãã®ã¡ãœããã¯ãåŒæ°ãªã¹ã(x, y)ã§åŒã³åºãããŸãã ã¡ãœãããstaticã§ãªãå Žåãã€ã³ã¹ã¿ã³ã¹åŒã¯thisã«ãªããŸããT.F(x, y)ãªãŒããŒããŒãã®è§£æ±ºã¯ãã¯ã©ã¹ãŸãã¯æ§é äœ Få ã®æé©ãªã¡ãœããTãéžæããããã«é©çšãããŸãã ã¡ãœãããstaticã§ãªãå Žåããã€ã³ãæãšã©ãŒãçºçããŸãã ãã®ã¡ãœããã¯ãåŒæ°ãªã¹ã(x, y)ã§åŒã³åºãããŸããe.F(x, y)ãªãŒããŒããŒãã®è§£æ±ºã¯ã Fã®åã«ãã£ãŠæå®ãããã¯ã©ã¹ãæ§é äœããŸãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã§æé©ãªã¡ãœããeãéžæããããã«é©çšãããŸãã ã¡ãœãããstaticãããŠããå Žåããã€ã³ãæãšã©ãŒãçºçããŸãã ã¡ãœããã¯ã€ã³ã¹ã¿ã³ã¹åŒeãšåŒæ°ãªã¹ã(x, y)ã䜿çšããŠåŒã³åºãããŸããããããã㣠ã¢ã¯ã»ã¹ã På å«ã¯ã©ã¹ãŸãã¯æ§é äœå ã®ãããã㣠Pã® get ã¢ã¯ã»ãµãŒãåŒã³åºãããŸããPãæžã蟌ã¿å°çšãŸã㯠init å°çšã®å Žåãã³ã³ãã€ã«æãšã©ãŒãçºçããŸããPãstaticã§ãªãå Žåãã€ã³ã¹ã¿ã³ã¹åŒã¯thisã«ãªããŸããP = valueã·ããªãª 1: å å«ã¯ã©ã¹ãŸãã¯æ§é äœã®ãããã㣠Pã® set ã¢ã¯ã»ãµãŒããåŒæ°ãªã¹ã(value)ã䜿çšããŠåŒã³åºãããŸããPãèªã¿åãå°çšã®å Žåãã³ã³ãã€ã«æãšã©ãŒãçºçããŸããPãstaticã§ãªãå Žåãã€ã³ã¹ã¿ã³ã¹åŒã¯thisã«ãªããŸãã ã·ããªãª 2: å å«ã¯ã©ã¹ãŸãã¯æ§é äœã®ããããã£Pã® init ã¢ã¯ã»ãµãŒããåŒæ°ãªã¹ã(value)ã䜿çšããŠåŒã³åºãããŸãã ãã®äœ¿çšæ³ããªããžã§ã¯ãã®æ§ç¯ãã§ãŒãºäžã§ãªãå Žåãã³ã³ãã€ã«æãšã©ãŒãçºçããŸã ([§15.7.3.3](classes.md#15733-init-accessors))ãT.På å«ã¯ã©ã¹ãŸãã¯æ§é äœ På ã®ããããã£Tã® get ã¢ã¯ã»ãµãŒãåŒã³åºãããŸããPãstaticãããŠããªãå ŽåããŸãã¯Pãæžã蟌ã¿å°çšãŸã㯠init å°çšã®å Žåãã³ã³ãã€ã«æãšã©ãŒãçºçããŸããT.P = valueã·ããªãª 1: ã¯ã©ã¹ãŸãã¯æ§é äœ Pã®ããããã£Tã® set ã¢ã¯ã»ãµãŒããåŒæ°ãªã¹ã(value)ã§åŒã³åºãããŸããPãstaticã§ãªãå ŽåããŸãã¯Pãèªã¿åãå°çšã®å Žåã¯ãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã ã·ããªãª 2: ã¯ã©ã¹ãŸãã¯æ§é äœPå ã®ããããã£Tã® init ã¢ã¯ã»ãµãŒããåŒæ°ãªã¹ã(value)ã§åŒã³åºãããŸãã ã³ã³ãã€ã«æãšã©ãŒã¯ãPãstaticãããŠããªãå ŽåããŸãã¯ãã®äœ¿çšæ³ããªããžã§ã¯ãã®æ§ç¯ãã§ãŒãºäžã§ãªãå Žåã«çºçããŸã ([§15.7.3.3](classes.md#15733-init-accessors))ãe.PPã®åã«ãã£ãŠæå®ãããã¯ã©ã¹ãæ§é äœããŸãã¯ã€ã³ã¿ãŒãã§ã€ã¹å ã®ããããã£Eã® get ã¢ã¯ã»ãµãŒã¯ãã€ã³ã¹ã¿ã³ã¹åŒeã§åŒã³åºãããŸãã ãã€ã³ãæãšã©ãŒã¯ãPãstaticãããŠããå ŽåããŸãã¯Pãæžã蟌ã¿å°çšãŸã㯠init å°çšã®å Žåã«çºçããŸããe.P = valueã·ããªãª 1: Pã®åã«ãã£ãŠæå®ãããã¯ã©ã¹ãæ§é äœããŸãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã§Eããããã£ã® set ã¢ã¯ã»ãµãŒããã€ã³ã¹ã¿ã³ã¹åŒeãšåŒæ°ãªã¹ã(value)ã§åŒã³åºãããŸããPãstaticã®å ŽåããŸãã¯Pãèªã¿åãå°çšã®å Žåã¯ããã€ã³ãã£ã³ã°æãšã©ãŒãçºçããŸãã ã·ããªãª 2:Pã®åã«ãã£ãŠæå®ãããã¯ã©ã¹ãæ§é äœããŸãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã§Eããããã£ã® init ã¢ã¯ã»ãµãŒã¯ãã€ã³ã¹ã¿ã³ã¹åŒeãšåŒæ°ãªã¹ã(value)ã§åŒã³åºãããŸãã ãã€ã³ãæãšã©ãŒã¯ãPãstaticãããŠããå ŽåããŸãã¯ãã®äœ¿çšæ³ããªããžã§ã¯ãã®æ§ç¯ãã§ãŒãºäžã§ãªãå Žåã«çºçããŸã ([§15.7.3.3](classes.md#15733-init-accessors))ãã€ãã³ããžã®ã¢ã¯ã»ã¹ E += valueå å«ã¯ã©ã¹ãŸãã¯æ§é äœå ã®ã€ãã³ã Eã® add ã¢ã¯ã»ãµãŒãåŒã³åºãããŸããEãstaticã§ãªãå Žåãã€ã³ã¹ã¿ã³ã¹åŒã¯thisã«ãªããŸããE -= valueå å«ã¯ã©ã¹ãŸãã¯æ§é äœå ã®ã€ãã³ã Eã® remove ã¢ã¯ã»ãµãŒãåŒã³åºãããŸããEãstaticã§ãªãå Žåãã€ã³ã¹ã¿ã³ã¹åŒã¯thisã«ãªããŸããT.E += valueå å«ã¯ã©ã¹ãŸãã¯æ§é äœ Eå ã®ã€ãã³ãTã® add ã¢ã¯ã»ãµãŒãåŒã³åºãããŸããEãstaticã§ãªãå Žåããã€ã³ãæãšã©ãŒãçºçããŸããT.E -= valueå å«ã¯ã©ã¹ãŸãã¯æ§é äœ Eå ã®ã€ãã³ãTã® add ã¢ã¯ã»ãµãŒãåŒã³åºãããŸããEãstaticã§ãªãå Žåããã€ã³ãæãšã©ãŒãçºçããŸããe.E += valueEã®åã«ãã£ãŠæå®ãããã¯ã©ã¹ãæ§é äœããŸãã¯ã€ã³ã¿ãŒãã§ã€ã¹å ã®ã€ãã³ãEã®è¿œå ã¢ã¯ã»ãµãŒããã€ã³ã¹ã¿ã³ã¹åŒeã䜿çšããŠåŒã³åºãããŸããEãstaticã®å Žåããã€ã³ãæãšã©ãŒãçºçããŸããe.E -= valueEã®åã«ãã£ãŠæå®ãããã¯ã©ã¹ãæ§é äœããŸãã¯ã€ã³ã¿ãŒãã§ã€ã¹å ã®ã€ãã³ãEã®åé€ã¢ã¯ã»ãµãŒããã€ã³ã¹ã¿ã³ã¹åŒeã䜿çšããŠåŒã³åºãããŸããEãstaticã®å Žåããã€ã³ãæãšã©ãŒãçºçããŸããã€ã³ãã¯ãµãŒãžã®ã¢ã¯ã»ã¹ e[x, y]ãªãŒããŒããŒãã®è§£æ±ºã¯ã eã®åã«ãã£ãŠæå®ãããã¯ã©ã¹ãæ§é äœããŸãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã§æé©ãªã€ã³ãã¯ãµãŒãéžæããããã«é©çšãããŸãã ã€ã³ãã¯ãµãŒã® get ã¢ã¯ã»ãµãŒã¯ãã€ã³ã¹ã¿ã³ã¹åŒeãšåŒæ°ãªã¹ã(x, y)ã§åŒã³åºãããŸãã ã€ã³ãã¯ãµãŒãæžã蟌ã¿å°çšãŸã㯠init å°çšã®å Žåããã€ã³ãæãšã©ãŒãçºçããŸããe[x, y] = valueãªãŒããŒããŒãã®è§£æ±ºã¯ã eã®åã«ãã£ãŠæå®ãããã¯ã©ã¹ãæ§é äœããŸãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã§æé©ãªã€ã³ãã¯ãµãŒãéžæããããã«é©çšãããŸãã ã·ããªãª 1: ã€ã³ãã¯ãµãŒã® set ã¢ã¯ã»ãµãŒã¯ãã€ã³ã¹ã¿ã³ã¹åŒeãšåŒæ°ãªã¹ã(x, y, value)ã§åŒã³åºãããŸãã ã€ã³ãã¯ãµãŒãèªã¿èŸŒã¿å°çšã®å Žåããã€ã³ãæãšã©ãŒãçºçããŸãã ã·ããªãª 2: ã€ã³ãã¯ãµãŒã® init ã¢ã¯ã»ãµãŒã¯ãã€ã³ã¹ã¿ã³ã¹åŒeã§åŒã³åºãããåŒæ°ãªã¹ãã(x, y, value)ã ãã€ã³ãæãšã©ãŒã¯ããã®äœ¿çšæ³ããªããžã§ã¯ãã®æ§ç¯ãã§ãŒãºäžã§ãªãå Žåã«çºçããŸã ([§15.7.3.3](classes.md#15733-init-accessors))ãæŒç®åã®åŒã³åºã -xãªãŒããŒããŒã解決ã¯ã xã®åã«ãã£ãŠæå®ãããã¯ã©ã¹ãŸãã¯æ§é äœå ã®æé©ãªåé æŒç®åãéžæããããã«é©çšãããŸãã éžæããæŒç®åã¯ãåŒæ°ãªã¹ã(x)ã§åŒã³åºãããŸããx + yãªãŒããŒããŒãã®è§£æ±ºã¯ã xãšyã®åã«ãã£ãŠæå®ãããã¯ã©ã¹ãŸãã¯æ§é äœã§æé©ãªäºé æŒç®åãéžæããããã«é©çšãããŸãã éžæããæŒç®åã¯ãåŒæ°ãªã¹ã(x, y)ã§åŒã³åºãããŸããã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã®åŒã³åºã new T(x, y)ãªãŒããŒããŒãã®è§£æ±ºã¯ãã¯ã©ã¹ãŸãã¯æ§é äœ Tã§æé©ãªã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒãéžæããããã«é©çšãããŸãã ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãåŒæ°ãªã¹ã(x, y)ã§åŒã³åºãããŸããæ³šé
12.6.2 åŒæ°ãªã¹ã
12.6.2.1 å šè¬
ãã¹ãŠã®é¢æ°ã¡ã³ããŒãšããªã²ãŒãã®åŒã³åºãã«ã¯ã颿°ã¡ã³ããŒã®ãã©ã¡ãŒã¿ãŒã®å®éã®å€ãŸãã¯å€æ°åç §ãæäŸããåŒæ°ãªã¹ããå«ãŸããŠããŸãã 颿°ã¡ã³ããŒåŒã³åºãã®åŒæ°ãªã¹ããæå®ããããã®æ§æã¯ã颿°ã¡ã³ã㌠ã®ã«ããŽãªã«ãã£ãŠç°ãªããŸãã
- ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒãã¡ãœãããã€ã³ãã¯ãµãŒãããªã²ãŒãã®å ŽåãåŒæ°ã¯æ¬¡ã«ç€ºãããã«ã argument_listãšããŠæå®ãããŸãã ã€ã³ãã¯ãµãŒã®å Žåãset ã¢ã¯ã»ãµãŒãŸã㯠init ã¢ã¯ã»ãµãŒãåŒã³åºããšããåŒæ°ãªã¹ãã«ã¯ã代å
¥æŒç®åã®å³ãªãã©ã³ããšããŠæå®ãããåŒã远å ã§å«ãŸããŸãã
泚: ãã®è¿œå åŒæ°ã¯ãset ã¢ã¯ã»ãµãŒãŸã㯠init ã¢ã¯ã»ãµãŒã®åŒã³åºãäžã«ã ãããªãŒããŒããŒã解決ã«ã¯äœ¿çšãããŸããã æ³šé
- ããããã£ã®å Žåãget ã¢ã¯ã»ãµãŒã®åŒã³åºãæã«åŒæ°ãªã¹ãã¯ç©ºã«ãªããset ã¢ã¯ã»ãµãŒãŸã㯠init ã¢ã¯ã»ãµãŒãåŒã³åºããšãã«ä»£å ¥æŒç®åã®å³ãªãã©ã³ããšããŠæå®ãããåŒã§æ§æãããŸãã
- ã€ãã³ãã®å ŽåãåŒæ°ãªã¹ãã¯ã
+=æŒç®åãŸãã¯-=æŒç®åã®å³ãªãã©ã³ããšããŠæå®ãããåŒã§æ§æãããŸãã - ãŠãŒã¶ãŒå®çŸ©æŒç®åã®å ŽåãåŒæ°ãªã¹ãã¯åé æŒç®åã®åäžãªãã©ã³ããŸãã¯äºé æŒç®åã® 2 ã€ã®ãªãã©ã³ãã§æ§æãããŸãã
ãããã㣠(§15.7) ãšã€ãã³ã (§15.8) ã®åŒæ°ã¯ãåžžã«å€ãã©ã¡ãŒã¿ãŒ (§15.6.2.2) ãšããŠæž¡ãããŸãã ãŠãŒã¶ãŒå®çŸ©æŒç®å (§15.10) ã®åŒæ°ã¯ãåžžã«å€ãã©ã¡ãŒã¿ãŒ (§15.6.2.2) ãŸãã¯å
¥åãã©ã¡ãŒã¿ãŒ (§9.2.8) ãšããŠæž¡ãããŸãã ã€ã³ãã¯ãµãŒ (§15.9) ã®åŒæ°ã¯ãåžžã«å€ãã©ã¡ãŒã¿ãŒ (§15.6.2.2)ãå
¥åãã©ã¡ãŒã¿ãŒ (§9.2.8)ãçš®é¡ ref readonly ã®åç
§ãã©ã¡ãŒã¿ãŒ (§15.6.2.3.3)ããŸãã¯ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ (§15.6.2.4) ãšããŠæž¡ãããŸãã
refçš®é¡ã®åºåãã©ã¡ãŒã¿ãŒãšåç
§ãã©ã¡ãŒã¿ãŒã¯ã颿°ã¡ã³ããŒã®ãããã®ã«ããŽãªã§ã¯ãµããŒããããŠããŸããã
ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒãã¡ãœãããã€ã³ãã¯ãµãŒããŸãã¯ããªã²ãŒãåŒã³åºãã®åŒæ°ã¯ã argument_listãšããŠæå®ãããŸãã
argument_list
: argument (',' argument)*
;
argument
: argument_name? argument_value
;
argument_name
: identifier ':'
;
argument_value
: expression
| 'in' 'scoped'? variable_reference
| 'ref' 'scoped'? variable_reference
| 'out' 'scoped'? variable_reference
;
argument_list ã¯ã1 ã€ä»¥äžã® åŒæ°ã³ã³ãã§åºåã£ãŠæ§æãããŸãã ååŒæ°ã¯ãçç¥å¯èœãª argument_name ã®åŸã« argument_valueã§æ§æãããŸãã argument_name ãæã€ åŒæ° 㯠ååä»ãåŒæ°ãšåŒã°ããŸããã argument_name ã®ãªã åŒæ° 㯠äœçœ®åŒæ°ã§ãã
argument_value ã«ã¯ã次ã®ããããã®åœ¢åŒã䜿çšã§ããŸãã
- åŒæ°ãå€ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããããå
¥åãŸãã¯
ref readonlyåç §ãã©ã¡ãŒã¿ãŒã«å€æããã(§12.6.4.2 ãã㳠§12.6.2.3 ã§èª¬æãããŠãã) ã«ãã£ãŠæ±ºå®ããããšããã«æž¡ãããããšã瀺ãåŒã - ããŒã¯ãŒã
inå¿ èŠã«å¿ããŠscopedãç¶ãããã®åŸã« variable_reference (§9.5) ãç¶ããåŒæ°ãå ¥åãã©ã¡ãŒã¿ãŒ (§15.6.2.3.2) ãšããŠæž¡ãããããref readonlyåç §ãã©ã¡ãŒã¿ãŒ (§15.6.2.3.3) ã«å€æããããã®åŸããã®ãŸãŸæž¡ãããããšã瀺ããŸãã 倿°ãå ¥åãã©ã¡ãŒã¿ãŒãšããŠæž¡ãåã«ã倿°ã確å®ã« (§9.4) å²ãåœãŠãå¿ èŠããããŸããscopedã®èª¬æã«ã€ããŠã¯ã§9.7.3 ãåç §ããŠãã ããã - ããŒã¯ãŒã
refå¿ èŠã«å¿ããŠãscopedãç¶ãããã®åŸã« variable_reference (§9.5) ãç¶ããåŒæ°ãåç §ãã©ã¡ãŒã¿ãŒ (§15.6.2.3.3) ãšããŠæž¡ãããããšã瀺ããŸãã 倿°ãåç §ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãåã«ã倿°ã確å®ã« (§9.4) å²ãåœãŠãå¿ èŠããããŸããscopedã®èª¬æã«ã€ããŠã¯ã§9.7.3 ãåç §ããŠãã ããã - ããŒã¯ãŒã
outãå¿ èŠã«å¿ããŠãscopedãç¶ãã åŒæ° ãåºåãã©ã¡ãŒã¿ãŒ (§15.6.2.3.4) ãšããŠæž¡ãããããšã瀺ãvariable_reference (§9.5) ãç¶ããŸãã 倿°ãåºåãã©ã¡ãŒã¿ãŒãšããŠæž¡ããã颿°ã¡ã³ããŒåŒã³åºãã®åŸã倿°ã¯ç¢ºå®ã«å²ãåœãŠãããŠãããšèŠãªãããŸã (§9.4)ãscopedã®èª¬æã«ã€ããŠã¯ã§9.7.3 ãåç §ããŠãã ããã - ããŒã¯ãŒã
outãå¿ èŠã«å¿ããŠãscopedãç¶ããæ°ããããŒã«ã«å€æ°ã宣èšãããåºå ãã©ã¡ãŒã¿ãŒ ( §15.6.2.3.4) ãšããŠæž¡ãããããšã瀺ãdeclaration_expression (§12.20) ãç¶ããŸãã æ°ãã宣èšããã倿°ã¯ã颿°ã¡ã³ããŒã®åŒã³åºãã®åŸã«ç¢ºå®ã«å²ãåœãŠãããŠãã (§9.4) ãšèŠãªãããŸããscopedã®èª¬æã«ã€ããŠã¯ã§9.7.3 ãåç §ããŠãã ããã
ãã®ãã©ãŒã ã¯ãåŒæ°ã® ãã©ã¡ãŒã¿ãŒåãæž¡ãã¢ãŒã ( å€ã å
¥åã åç
§ããŸã㯠åºå) ãããããæ±ºå®ããŸã ( out ããŒã¯ãŒãã䜿çšããäž¡æ¹ã®ãã©ãŒã ã§ã¯ãåºåããã·ã³ã° ã¢ãŒãã䜿çšãããŸã)ã ãã ããåè¿°ã®ããã«ã倿ž¡ãã¢ãŒãã®åŒæ°ã¯ãå
¥åã¢ãŒããŸã㯠ref readonly åç
§åãæž¡ãã¢ãŒãã§ 1 ã€ã«å€æãããå¯èœæ§ããããŸãã
æ®çºæ§ãã£ãŒã«ã (§15.5.4) ãå ¥åãåºåããŸãã¯åç §ãã©ã¡ãŒã¿ãŒãšããŠæž¡ããšãåŒã³åºãããã¡ãœããã§ã¯ãã£ãŒã«ããæ®çºæ§ãšããŠæ±ãããšãã§ããªããããèŠåãçºçããŸãã
12.6.2.2 察å¿ãããã©ã¡ãŒã¿ãŒ
åŒæ°ãªã¹ãå ã®åŒæ°ããšã«ãåŒã³åºããã颿°ã¡ã³ããŒãŸãã¯ããªã²ãŒãã«å¯Ÿå¿ãããã©ã¡ãŒã¿ãŒãå¿ èŠã§ãã
次ã«ç€ºããã©ã¡ãŒã¿ãŒ ãªã¹ãã¯ã次ã®ããã«æ±ºå®ãããŸãã
- ã¯ã©ã¹ã§å®çŸ©ãããŠããä»®æ³ã¡ãœãããšã€ã³ãã¯ãµãŒã®å Žåããã©ã¡ãŒã¿ãŒ ãªã¹ãã¯ãã¬ã·ãŒããŒã®éçåããéå§ãããã®åºåºã¯ã©ã¹ãæ€çŽ¢ãããšãã«æ€åºããã颿°ã¡ã³ããŒã®æåã®å®£èšãŸãã¯ãªãŒããŒã©ã€ãããéžæãããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã§å®çŸ©ãããä»®æ³ã¡ãœãããšã€ã³ãã¯ãµãŒã®å Žåããã©ã¡ãŒã¿ãŒ ãªã¹ãã¯ãã¬ã·ãŒããŒã®éçãªåãšã颿°ã¡ã³ããŒã®å®£èšãŸãã¯ãªãŒããŒã©ã€ããå«ãçŽæ¥ãŸãã¯éæ¥çãªåºæ¬ã€ã³ã¿ãŒãã§ã€ã¹ã®äžãããæãå ·äœçãªã€ã³ã¿ãŒãã§ã€ã¹ (§19.4.10) ã«ãã颿°ã¡ã³ããŒã®å®£èšãŸãã¯ãªãŒããŒã©ã€ãããéžæãããŸãã ãã®ãããªæãå ·äœçãªäžæã®ã€ã³ã¿ãŒãã§ã€ã¹ãååšããªãå Žåã¯ãã³ã³ãã€ã«æãšã©ãŒã§ãã
- éšåã¡ãœããã®å Žåãå®çŸ©ããéšåã¡ãœãã宣èšã®ãã©ã¡ãŒã¿ãŒ ãªã¹ãã䜿çšãããŸãã
- ä»ã®ãã¹ãŠã®é¢æ°ã¡ã³ããŒãšããªã²ãŒãã«ã¯ã䜿çšããããã©ã¡ãŒã¿ãŒ ãªã¹ãã 1 ã€ã ããããŸãã
åŒæ°ãŸãã¯ãã©ã¡ãŒã¿ãŒã®äœçœ®ã¯ãåŒæ°ãªã¹ããŸãã¯ãã©ã¡ãŒã¿ãŒ ãªã¹ãã®åã«ããåŒæ°ãŸãã¯ãã©ã¡ãŒã¿ãŒã®æ°ãšããŠå®çŸ©ãããŸãã
颿°ã¡ã³ããŒåŒæ°ã®å¯Ÿå¿ãããã©ã¡ãŒã¿ãŒã¯ã次ã®ããã«èšå®ãããŸãã
- 次ã®ãããªã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒãã¡ãœãããã€ã³ãã¯ãµãŒãããã³ããªã²ãŒãã® argument_list å
ã®åŒæ°ã
- ãã©ã¡ãŒã¿ãŒããã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ã§ããã颿°ã¡ã³ããŒãå±éããã圢åŒã§åŒã³åºãããªãéãããã©ã¡ãŒã¿ãŒ ãªã¹ãå ã®åãäœçœ®ã«ãã©ã¡ãŒã¿ãŒãçºçããäœçœ®åŒæ°ã¯ããã®ãã©ã¡ãŒã¿ãŒã«å¯Ÿå¿ããŸãã
- å±éããã圢åŒã§åŒã³åºããããã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ãæã€é¢æ°ã¡ã³ããŒã®äœçœ®åŒæ°ããã©ã¡ãŒã¿ãŒ ãªã¹ãå ã®ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ã®äœçœ®ä»¥éã«çºçãããã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³å ã®èŠçŽ ã«å¯Ÿå¿ããŸãã
- ååä»ãåŒæ°ã¯ããã©ã¡ãŒã¿ãŒ ãªã¹ãå ã®åãååã®ãã©ã¡ãŒã¿ãŒã«å¯Ÿå¿ããŸãã
- ã€ã³ãã¯ãµãŒã®å Žåãset ã¢ã¯ã»ãµãŒãŸã㯠init ã¢ã¯ã»ãµãŒãåŒã³åºããšãã代å
¥æŒç®åã®å³ãªãã©ã³ããšããŠæå®ãããåŒã¯ãset ãŸã㯠init ã¢ã¯ã»ãµãŒå®£èšã®æé»çãª
valueãã©ã¡ãŒã¿ãŒã«å¯Ÿå¿ããŸãã
- ããããã£ã®å Žåãget ã¢ã¯ã»ãµãŒãåŒã³åºããšãã«åŒæ°ã¯ãããŸããã set ã¢ã¯ã»ãµãŒãŸã㯠init ã¢ã¯ã»ãµãŒãåŒã³åºããšããä»£å ¥æŒç®åã®å³ãªãã©ã³ããšããŠæå®ãããåŒã¯ãset ãŸã㯠init ã¢ã¯ã»ãµãŒå®£èšã®æé»çãªå€ãã©ã¡ãŒã¿ãŒã«å¯Ÿå¿ããŸãã
- ãŠãŒã¶ãŒå®çŸ©ã®åé æŒç®å (倿ãå«ã) ã®å Žåãåäžãªãã©ã³ãã¯æŒç®å宣èšã®åäžãã©ã¡ãŒã¿ãŒã«å¯Ÿå¿ããŸãã
- ãŠãŒã¶ãŒå®çŸ©ã®äºé æŒç®åã®å Žåãå·Šãªãã©ã³ãã¯æåã®ãã©ã¡ãŒã¿ãŒã«å¯Ÿå¿ããå³åŽã®ãªãã©ã³ãã¯æŒç®å宣èšã® 2 çªç®ã®ãã©ã¡ãŒã¿ãŒã«å¯Ÿå¿ããŸãã
- ååã®ãªãåŒæ°ã¯ãäœçœ®ãæå®ãããŠããªãååä»ãåŒæ°ãŸãã¯ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ã«å¯Ÿå¿ããååä»ãåŒæ°ã®åŸã«ããå Žåããã©ã¡ãŒã¿ãŒã«å¯Ÿå¿ããŸããã
泚æ:
void M(bool a = true, bool b = true, bool c = true);ã«ãã£ãŠM(c: false, valueB);ãåŒã³åºãããã®ãé²ããŸãã 1 çªç®ã®åŒæ°ã¯ç¯å²å€ã§äœ¿çšãããŸã (åŒæ°ã¯æåã®äœçœ®ã§äœ¿çšãããŸãããcãšããååã®ãã©ã¡ãŒã¿ãŒã¯ 3 çªç®ã®äœçœ®ã«ãããŸã)ãæ¬¡ã®åŒæ°ã«ååãä»ããå¿ èŠããããŸãã ã€ãŸããæ«å°Ÿä»¥å€ã®ååä»ãåŒæ°ã¯ãååãšäœçœ®ãåã察å¿ãããã©ã¡ãŒã¿ãŒãæ€çŽ¢ããå Žåã«ã®ã¿èš±å¯ãããŸãã æ³šé
12.6.2.3 åŒæ°ãªã¹ãã®å®è¡æè©äŸ¡
颿°ã¡ã³ããŒåŒã³åºã (§12.6.6) ã®å®è¡æã«ãåŒæ°ãªã¹ãã®åŒãŸãã¯å€æ°åç §ã¯ã次ã®ããã«å·Šããå³ã«é çªã«è©äŸ¡ãããŸãã
å€åŒæ°ã®å Žåããã©ã¡ãŒã¿ãŒã®åãæž¡ãã¢ãŒããå€ã®å Žå
åŒæ°åŒãè©äŸ¡ããã察å¿ãããã©ã¡ãŒã¿ãŒåãžã®æé»çãªå€æ (§10.2) ãå®è¡ãããŸãã çµæã®å€ã¯ã颿°ã¡ã³ããŒåŒã³åºãã® value ãã©ã¡ãŒã¿ãŒã®åæå€ã«ãªããŸãã
ãã以å€ã®å Žåããã©ã¡ãŒã¿ãŒã®åãæž¡ãã¢ãŒãã¯å ¥åãŸã㯠ref èªã¿åãæã§ãã åŒæ°ã倿°åç §ã§ãããåŒæ°ã®åãšãã©ã¡ãŒã¿ãŒã®åã®éã« ID 倿 (§10.2.2) ãååšããå Žåãçµæã®æ ŒçŽå Žæã¯é¢æ°ã¡ã³ããŒåŒã³åºãã®ãã©ã¡ãŒã¿ãŒã«ãã£ãŠè¡šãããæ ŒçŽå Žæã«ãªããŸãã ãã以å€ã®å Žåã¯ã察å¿ãããã©ã¡ãŒã¿ãŒãšåãåã§ã¹ãã¬ãŒãžã®å ŽæãäœæãããŸãã åŒæ°åŒãè©äŸ¡ããã察å¿ãããã©ã¡ãŒã¿ãŒåãžã®æé»çãªå€æ (§10.2) ãå®è¡ãããŸãã çµæã®å€ã¯ããã®ã¹ãã¬ãŒãžã®å Žæã«æ ŒçŽãããŸãã ãã®ã¹ãã¬ãŒãžã®å Žæã¯ã颿°ã¡ã³ããŒåŒã³åºãã®å ¥åãã©ã¡ãŒã¿ãŒã«ãã£ãŠè¡šãããŸãã
äŸ: 次ã®å®£èšãšã¡ãœããåŒã³åºããæå®ããŸãã
static void M1(in int p1, ref readonly int p2) { ... } int i = 10; M1(i, i); // i is passed as input and reference arguments M1(i + 5, i + 7); // both transformed to temporary argumentsM1(i, i)ã¡ãœããã®åŒã³åºãã§ã¯ãièªäœã¯ãããããå ¥åãšåç §åŒæ°ãšããŠæž¡ãããŸããããã¯ã倿°ãšããŠåé¡ããã察å¿ããå ¥åãã©ã¡ãŒã¿ãŒãšåç §ãã©ã¡ãŒã¿ãŒãšåãåintãããããã§ããM1(i + 5, i + 7)ã¡ãœããåŒã³åºãã§ã¯ã2 ã€ã®ååã®ãªãint倿°ãäœæããã察å¿ããåŒæ°ã®å€ã§åæåãããããããå ¥ååŒæ°ãšåç §åŒæ°ãšããŠæž¡ãããŸãã §12.6.4.2 ãã㳠§12.6.4.4ãåç §ããŠãã ãããçµäºãµã³ãã«
å ¥åãåºåããŸãã¯åç §åŒæ°ã®å Žåã倿°åç §ãè©äŸ¡ãããçµæã®æ ŒçŽå Žæã颿°ã¡ã³ããŒåŒã³åºãã®ãã©ã¡ãŒã¿ãŒã«ãã£ãŠè¡šãããæ ŒçŽå Žæã«ãªããŸãã å ¥åãŸãã¯åç §åŒæ°ã®å Žåã倿°ã¯ã¡ãœããåŒã³åºãã®æç¹ã§ç¢ºå®ã«å²ãåœãŠãããŸãã 倿°åç §ãåºååŒæ°ãšããŠæå®ãããŠããå ŽåããŸã㯠reference_typeã®é åèŠçŽ ã§ããå Žåã¯ãé åã®èŠçŽ åããã©ã¡ãŒã¿ãŒã®åãšåãã§ããããšã確èªããããã«å®è¡æãã§ãã¯ãå®è¡ãããŸãã ãã®ãã§ãã¯ã倱æãããšã
System.ArrayTypeMismatchExceptionãã¹ããŒãããŸãã
泚: ãã®å®è¡æãã§ãã¯ã¯ãé åã®å ±å€æ§ (§17.6) ãåå ã§å¿ èŠã§ãã æ³šé
äŸ: 次ã®ã³ãŒãäŸã®å 容:
class Test { static void F(ref object x) {...} static void Main() { object[] a = new object[10]; object[] b = new string[10]; F(ref a[0]); // Ok F(ref b[1]); // ArrayTypeMismatchException } }
Fã® 2 åç®ã®åŒã³åºãã¯ãSystem.ArrayTypeMismatchExceptionã®å®éã®èŠçŽ åãbã§ãããstringã§ã¯ãªããããobjectãã¹ããŒãããåå ãšãªããŸããçµäºãµã³ãã«
ã¡ãœãããã€ã³ãã¯ãµãŒãããã³ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ããã®å³ç«¯ã®ãã©ã¡ãŒã¿ãŒããã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ãšããŠå®£èšã§ããŸã (§15.6.2.4)ã ãã®ãããªé¢æ°ã¡ã³ããŒã¯ã該åœãã (§12.6.4.2) ã«å¿ããŠãéåžžã®åœ¢åŒãŸãã¯å±éããã圢åŒã§åŒã³åºãããŸãã
- ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ãæã€é¢æ°ã¡ã³ããŒãéåžžã®åœ¢åŒã§åŒã³åºãããå Žåããã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ã«æå®ãããåŒæ°ã¯ããã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³åã«æé»çã«å€æå¯èœãªåäžã®åŒ (§10.2) ã§ããå¿ èŠããããŸãã ãã®å Žåããã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ã¯å€ãã©ã¡ãŒã¿ãŒãšãŸã£ããåãããã«åäœããŸãã
- ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ãæã€é¢æ°ã¡ã³ããŒãå±é圢åŒã§åŒã³åºããããšãåŒã³åºãã§ã¯ããã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ã«å¯Ÿã㊠0 å以äžã®äœçœ®åŒæ°ãæå®ããå¿ èŠããããŸããååŒæ°ã¯ããã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ã®èŠçŽ åã«æé»çã«å€æå¯èœãªåŒ (§10.2) ã§ãã ãã®å ŽåãåŒã³åºãã¯ãåŒæ°ã®æ°ã«å¯Ÿå¿ããé·ãã®ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³åã®ã€ã³ã¹ã¿ã³ã¹ãäœæããæå®ãããåŒæ°å€ã䜿çšããŠé åã€ã³ã¹ã¿ã³ã¹ã®èŠçŽ ãåæåããæ°ããäœæãããé åã€ã³ã¹ã¿ã³ã¹ãå®éã®åŒæ°ãšããŠäœ¿çšããŸãã
åŒæ°ãªã¹ãã®åŒã¯ãåžžã«ããã¹ãé ã«è©äŸ¡ãããŸãã
äŸ: ãããã£ãŠããã®äŸã§ã¯
class Test { static void F(int x, int y = -1, int z = -2) => Console.WriteLine($"x = {x}, y = {y}, z = {z}"); static void Main() { int i = 0; F(i++, i++, i++); F(z: i++, x: i++); } }åºåãçæããŸãã
x = 0, y = 1, z = 2 x = 4, y = -1, z = 3çµäºãµã³ãã«
ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ãæã€é¢æ°ã¡ã³ããŒãå±éããã圢åŒã§å°ãªããšã 1 ã€ã®å±éãããåŒæ°ã§åŒã³åºããããšãå±éãããåŒæ°ãcollection_expressionã®collection_elementã§ãããã®ããã«åŒã³åºããåŠçãããŸã (§12.8.25)ã ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ã®åŒæ°ããªãå Žåã¯ã空ã®ã³ã¬ã¯ã·ã§ã³ãæž¡ãããŸããæž¡ãããåç §ãæ°ããå²ãåœãŠãããŠããããæ¢åã®ç©ºã®ã³ã¬ã¯ã·ã§ã³ã§ãããã¯æå®ãããŠããŸããã
ã®äŸ: 宣èšãäžããããå Žå
void F(int x, int y, params object[] args);ã¡ãœããã®æ¡åŒµåœ¢åŒã®æ¬¡ã®åŒã³åºã
F(10, 20, 30, 40); F(10, 20, 1, "hello", 3.0);æ£ç¢ºã«äžèŽãã
F(10, 20, new object[] { 30, 40 }); F(10, 20, new object[] { 1, "hello", 3.0 });çµäºãµã³ãã«
察å¿ããçç¥å¯èœãªãã©ã¡ãŒã¿ãŒãæã€é¢æ°ã¡ã³ããŒããåŒæ°ãçç¥ãããšã颿°ã¡ã³ããŒå®£èšã®æ¢å®ã®åŒæ°ãæé»çã«æž¡ãããŸãã (ããã«ã¯ãåè¿°ã®ããã«ãã¹ãã¬ãŒãžã®å Žæã®äœæãå«ãŸããå ŽåããããŸã)ã
泚: ãããã¯åžžã«äžå®ã§ããããããã®è©äŸ¡ã¯æ®ãã®åŒæ°ã®è©äŸ¡ã«ã¯åœ±é¿ããŸããã æ³šé
12.6.3 åæšè«
12.6.3.1 å šè¬
ååŒæ°ãæå®ããã«ãžã§ããªã㯠ã¡ãœãããåŒã³åºããšã åæšè« ããã»ã¹ã¯ãåŒã³åºãã®ååŒæ°ãæšè«ããããšããŸãã åæšè«ãååšãããšããžã§ããªã㯠ã¡ãœãããåŒã³åºãããã«ãã䟿å©ãªæ§æã䜿çšã§ããããã°ã©ãã¯åé·ãªåæ å ±ãæå®ããªãããã«ããããšãã§ããŸãã
äŸ:
class Chooser { static Random rand = new Random(); public static T Choose<T>(T first, T second) => rand.Next(2) == 0 ? first : second; } class A { static void M() { int i = Chooser.Choose(5, 213); // Calls Choose<int> string s = Chooser.Choose("apple", "banana"); // Calls Choose<string> } }åã®æšè«ã«ãããååŒæ°
intãšstringã¯ãåŒæ°ããã¡ãœããã«å¯ŸããŠæ±ºå®ãããŸããçµäºãµã³ãã«
åæšè«ã¯ãã¡ãœããåŒã³åºã (§12.8.10.2) ã®ãã€ã³ãæåŠçã®äžéšãšããŠçºçããåŒã³åºãã®ãªãŒããŒããŒã解決ã¹ãããã®åã«è¡ãããŸãã ã¡ãœããã®åŒã³åºãã§ç¹å®ã®ã¡ãœãã ã°ã«ãŒããæå®ãããŠããŠãã¡ãœããåŒã³åºãã®äžéšãšããŠååŒæ°ãæå®ãããŠããªãå Žåãã¡ãœãã ã°ã«ãŒãå ã®åãžã§ããªã㯠ã¡ãœããã«åæšè«ãé©çšãããŸãã åã®æšè«ãæåããå Žåãæšè«ãããååŒæ°ã䜿çšããŠãåŸç¶ã®ãªãŒããŒããŒã解決ã®ããã®åŒæ°ã®åãæ±ºå®ãããŸãã ãªãŒããŒããŒã解決ã§ãžã§ããªã㯠ã¡ãœãããåŒã³åºãã¡ãœãããšããŠéžæããå Žåãæšè«ãããååŒæ°ãåŒã³åºãã®ååŒæ°ãšããŠäœ¿çšãããŸãã ç¹å®ã®ã¡ãœããã®åæšè«ã倱æããå Žåããã®ã¡ãœããã¯ãªãŒããŒããŒãã®è§£æ±ºã«é¢äžããŸããã åæšè«èªäœã倱æããŠãããã€ã³ãæãšã©ãŒã¯çºçããŸããã ãã ãããªãŒããŒããŒãã®è§£æ±ºã§è©²åœããã¡ãœãããèŠã€ãããªãå Žåããã€ã³ãæãšã©ãŒãçºçããããšããããããŸãã
æå®ãããååŒæ°ãã¡ãœããå ã® 1 ã€ã®ãã©ã¡ãŒã¿ãŒ (§12.6.2.2) ã«å®å šã«å¯Ÿå¿ããŠããªãå ŽåããŸãã¯å¯Ÿå¿ããåŒæ°ãæããªãçç¥å¯èœã§ãªããã©ã¡ãŒã¿ãŒãããå Žåãæšè«ã¯ããã«å€±æããŸãã ãã以å€ã®å Žåã¯ããžã§ããªã㯠ã¡ãœããã«æ¬¡ã®ã·ã°ããã£ããããšããŸãã
Tâ M<Xâ...Xáµ¥>(Tâ pâ ... Tâ pâ)
ãã©ãŒã M(Eâ ...Eâ) ã¡ãœããåŒã³åºãã§ã¯ãåæšè«ã®ã¿ã¹ã¯ã¯ãåŒã³åºã Sâ...Sáµ¥ ãæå¹ã«ãªãããã«ååãã©ã¡ãŒã¿ãŒ Xâ...Xáµ¥ ã«å¯ŸããŠãäžæã®ååŒæ° M<Sâ...Sáµ¥>(Eâ...Eâ) ãæ€çŽ¢ããããšã§ãã
åæšè«ã®ããã»ã¹ãã¢ã«ãŽãªãºã ãšããŠä»¥äžã«èª¬æããŸãã æºæ ã³ã³ãã€ã©ã¯ããã¹ãŠã®ã±ãŒã¹ã§åãçµæã«éããå Žåã«ã代æ¿ã¢ãããŒãã䜿çšããŠå®è£ ã§ããŸãã
æšè«ã®ããã»ã¹äžãååãã©ã¡ãŒã¿ Xáµ¢ ã¯ãç¹å®ã®å ã«å¯ŸããŠSáµ¢ãšãªãããå¢çäžåŒãé¢é£ä»ããããæªåºå®ãšãªããŸããåå¢çã¯ããªãããã® T åã§ãã æåã«ã Xáµ¢ åå倿°ã¯ã空ã®å¢çã»ããã§åºå®è§£é€ãããŸãã
åã®æšè«ã¯æ®µéçã«è¡ãããŸãã åãã§ãŒãºã§ã¯ãåã®ãã§ãŒãºã®çµæã«åºã¥ããŠãããå€ãã®å倿°ã®ååŒæ°ãæšè«ããããšããŸãã æåã®ãã§ãŒãºã§ã¯å¢çã®ããã€ãã®åææšè«ãè¡ãããŸããã2 çªç®ã®ãã§ãŒãºã§ã¯å倿°ãç¹å®ã®åã«ä¿®æ£ãããããã«å¢çãæšè«ãããŸãã 2 çªç®ã®ãã§ãŒãºã¯ãäœåºŠãç¹°ãè¿ãå¿ èŠãããå ŽåããããŸãã
泚: åæšè«ã¯ãã¡ãœãã ã°ã«ãŒãã®å€æ (§12.6.3.16) ãäžé£ã®åŒã®æãäžè¬çãªåã®æ€çŽ¢ (§12.6.3.17) ãªã©ãä»ã®ã³ã³ããã¹ãã§ã䜿çšãããŸãã æ³šé
12.6.3.2 第 1 ãã§ãŒãº
Eáµ¢ã¡ãœããåŒæ°ããšã«ããã察å¿ãããã©ã¡ãŒã¿ãŒåEáµ¢ãžã®å
¥ååæšè« (Táµ¢) ãè¡ãããŸãã
12.6.3.3 第2ãã§ãŒãº
2 çªç®ã®ãã§ãŒãºã¯æ¬¡ã®ããã«é²ã¿ãŸãã
- (§12.6.3.6) ã«
Xáµ¢ããªããã¹ãŠã®åºå®ãããŠããªãå倿°ã¯ããã¹ãŠã®Xâãåºå®ãããŠããŸã (§12.6.3.13)ã - ãã®ãããªå倿°ãååšããªãå Žåãæªåºå®ã® å倿°
Xáµ¢ã¯ãã¹ãŠãæ¬¡ã®æ¡ä»¶ãæºããããåºå®å ã«ãªããŸãã-
Xâã«äŸåããå倿°Xáµ¢ãå°ãªããšã1ã€ãããŸã -
Xáµ¢ã«ç©ºã§ãªãå¢çã»ããããã
-
- ãã®ãããªå倿°ãååšããã æªè§£æ±º ã®å倿°ããŸã ååšããå Žåãåæšè«ã¯å€±æããŸãã
- ãã以å€ã®å Žåã ä¿®æ£ãããŠããªã å倿°ããã以äžååšããªãå Žåãåã®æšè«ã¯æåããŸãã
- ãã以å€ã®å Žåã
Eáµ¢(Tⱌ) ã«åºå®ãããŠããªãå倿°ãå«ãŸããŠããããå ¥åå (§12.6.3.4) ã«ã¯å«ãŸããŠããªãã察å¿ãããã©ã¡ãŒã¿ãŒåXâãæã€ãã¹ãŠã® åŒæ°ã«å¯ŸããŠãåºååæšè« (§12.6.3.8) ãäœæãããŸãEáµ¢ãTⱌãã®åŸã2 çªç®ã®ãã§ãŒãºãç¹°ãè¿ãããŸãã
12.6.3.4 å ¥åå
Eãã¡ãœãã ã°ã«ãŒãã®ã¢ãã¬ã¹ã§ãããTã颿°ãã€ã³ã¿ãŒå (§24.3.3) ã®å ŽåãTã®ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒåã¯ãEåãæã€Tã®å
¥ååã«ãªããŸãã
泚: ããã¯å®å šã§ãªãã³ãŒãã«ã®ã¿é©çšãããŸãã æ³šé
12.6.3.5 åºåã®çš®é¡
Eãã¡ãœãã ã°ã«ãŒãã®ã¢ãã¬ã¹ã§ãããTã颿°ãã€ã³ã¿ãŒå (§24.3.3) ã®å ŽåãTã®æ»ãå€ã®åã¯Eåãæã€Tã®åºååã«ãªããŸãã
泚: ããã¯å®å šã§ãªãã³ãŒãã«ã®ã¿é©çšãããŸãã æ³šé
12.6.3.6 äŸåé¢ä¿
unfixed å倿°ã¯ Xáµ¢ã¯ãçŽæ¥ ã«äŸåããåŒæ° ã«å XâEáµ¥ ãããå ŽåãTáµ¥ å倿° Xâã¯ã ããã Eáµ¥ ã®Táµ¥ã§çºçããXáµ¢ ã¯ãå ããã Eáµ¥ ã®Táµ¥ã§çºçããŸãã
Xâ
ã Xáµ¢ ã«çŽæ¥äŸåããå ŽåããŸã㯠Xâ ã Xáµ¢ ã«çŽæ¥äŸåãã Xáµ¢ ã Xáµ¥ ã«äŸåããå Žåã Xáµ¥ ã¯Xâ ã«äŸåããŸãã ãããã£ãŠããã¯ã«äŸåãããã¯ãã¯ã«çŽæ¥äŸåãããã®æšç§»éå
ã§ãããååž°çãªéå
ã§ã¯ãªãã
12.6.3.7 å ¥ååã®æšè«
å
¥ååã®æšè«ã¯ã次ã®ããã«ååŒETãããŸãã
-
EãèŠçŽEáµ¢ãæã€collection_expressionã§ãTãèŠçŽ åTâãŸãã¯Tãnullable_value_typeã§T0?èŠçŽ åãTâT0ã®å Žåã¯ãåEáµ¢ã«å¯ŸããŠæ¬¡ã®ããã«æå®ããŸãã-
Eáµ¢ãexpression_elementã®å Žåãå ¥ååã®æšè«ã¯Eáµ¢toTâããè¡ãããŸãã -
Eáµ¢ãã€ãã¬ãŒã·ã§ã³å (§13.9.5)Sáµ¢ãæã€spread_elementã§ããå Žåãäžéæšè« (§12.6.3.11) ã¯Sáµ¢toTâããäœæãããŸãã
-
-
Eããã¢ãªã㣠ãšèŠçŽ ãNãããã¿ãã«åŒ (Eáµ¢) ã§ããå ŽåãTã¯ã察å¿ããèŠçŽ åãNãŸãã¯Tâã null 蚱容å€åTãæã€ã¢ãªãã£T0?ãæã€ã¿ãã«åã§ãããT0ã¯å¯Ÿå¿ããèŠçŽ åNãæã€ã¢ãªãã£Tâãæã€ã¿ãã«åã§ãããEáµ¢ããšã«ãEáµ¢ããTâãžã®å ¥ååæšè«ãè¡ãããŸãã -
Eãå¿å颿°ã§ãããTãããªã²ãŒãåãŸãã¯åŒããªãŒåã®å Žåãæç€ºçãªãã©ã¡ãŒã¿ãŒåã®æšè« (§12.6.3.9) ã¯EtoTããè¡ãããæç€ºçãªæ»ãå€ã®åæšè«ã¯EããTã«è¡ãããŸãã - ãã以å€ã®å Žåã
Eã«åUãããã察å¿ãããã©ã¡ãŒã¿ãŒãå€ãã©ã¡ãŒã¿ãŒ (§15.6.2.2) ã®å Žåãäžéæšè« (§12.6.3.11) ã¯UTè¡ãããŸãã - ãã以å€ã®å Žåã
Eã«åUãããã察å¿ãããã©ã¡ãŒã¿ãŒãåç §ãã©ã¡ãŒã¿ãŒ (§15.6.2.3.3) ãŸãã¯åºåãã©ã¡ãŒã¿ãŒ (§15.6.2.3.4) ã§ããå Žåã¯ãæ£ç¢ºãªæšè« (§12.6.3.10)Uã - ãã以å€ã®å Žåã
Eã«åUãããã察å¿ãããã©ã¡ãŒã¿ãŒãå ¥åãã©ã¡ãŒã¿ãŒ (§15.6.2.3.2) ã§ãEãå ¥ååŒæ°ã§ããå Žåã¯ãæ£ç¢ºãªæšè« (§12.6.3.10)Uã - ãã以å€ã®å Žåã
Eã«åUãããã察å¿ãããã©ã¡ãŒã¿ãŒãå ¥åãã©ã¡ãŒã¿ãŒ (§15.6.2.3.2) ã®å Žåãäžéæšè« (§12.6.3.11) ã¯UTè¡ãããŸãã - ãã以å€ã®å Žåããã®åŒæ°ã®æšè«ã¯è¡ãããŸããã
12.6.3.8 åºååã®æšè«
åºååã®æšè«ã¯æ¬¡ã®ããã«åEtoåTãããŸãã
-
EãèŠçŽEáµ¢ãæã€collection_expressionã§ãTãèŠçŽ åTâãŸãã¯Tãnullable_value_typeã§T0?èŠçŽ åãTâT0ã®å Žåã¯ãåEáµ¢ã«å¯ŸããŠæ¬¡ã®ããã«æå®ããŸãã-
Eáµ¢ãexpression_elementã®å ŽåãEáµ¢ããTâãžã®åºååã®æšè«ãè¡ãããŸãã -
Eáµ¢ãspread_elementã®å ŽåãEáµ¢ããæšè«ã¯è¡ãããŸããã
-
- ãã以å€ã®å Žåã
Eãã¢ãªãã£NãšèŠçŽEáµ¢ãæã€ã¿ãã«åŒã§ããå ŽåãTã¯ã察å¿ããèŠçŽ åTâãæã€ã¢ãªãã£Nãæã€ã¿ãã«åããŸãã¯Tã null 蚱容å€åT0?ã§ãããT0ã¯å¯Ÿå¿ããèŠçŽ åTâãæã€ã¢ãªãã£Nãæã€ã¿ãã«åã§ãããEáµ¢ããšã«åºååæšè«ãEáµ¢ããTâãããŸãã -
TBDãã以å€ã®å Žåã
Eãæšè«ãããæ»ãå€ã®åU(§12.6.3.14) ãæã€å¿å颿°ã§ãããTãããªã²ãŒãåãŸãã¯æ»ãå€ã®åãTâåŒããªãŒåã§ããå Žåãäžäœã®æšè« (§12.6.3.11) ã¯UtoTâããè¡ãããŸãã - ãã以å€ã®å Žåã
Eãã¡ãœãã ã°ã«ãŒãã§ãããTããã©ã¡ãŒã¿ãŒåTâ...Táµ¥ãšæ»ãå€ã®åTâãæã€ããªã²ãŒãåãŸãã¯åŒããªãŒåã§ãããåEã«ããTâ...Táµ¥ã®ãªãŒããŒããŒã解決ã«ãã£ãŠæ»ãå€ã®åUãæã€åäžã®ã¡ãœãããçæããããšã ããUãžã®Tâãè¡ãããŸãã -
Eãã¡ãœãã ã°ã«ãŒãã®ã¢ãã¬ã¹ã§ãããTã颿°ãã€ã³ã¿ãŒå (§24.3.3) ã®å Žåããã©ã¡ãŒã¿ãŒåTâ..Tâãšæ»ãå€ã®åTâã䜿çšããåETâ..Tâã®ãªãŒããŒããŒã解決ã«ãããæ»ãå€ã®åUãæã€ 1 ã€ã®ã¡ãœãããçæãããããUãžã®Tâãè¡ãããŸããæ³š: ããã¯å®å šã§ãªãã³ãŒãã«ã®ã¿é©çšãããŸãã æ³šé
- ãã以å€ã®å Žåã
EãåUã®åŒã§ããå Žåã äžéæšè« ãUããTãŸã§è¡ãããŸãã - ãã以å€ã®å Žåãæšè«ã¯è¡ãããŸããã
12.6.3.9 æç€ºçãªãã©ã¡ãŒã¿ãŒåã®æšè«
æç€ºçãªãã©ã¡ãŒã¿åæšè«ã¯ã以äžã®æ¹æ³ã§åŒ E ããåTè¡ãããŸãã
-
Eããã©ã¡ãŒã¿ãŒåUâ...Uáµ¥æç€ºçã«åæå®ãããå¿å颿°ã§ãTããã©ã¡ãŒã¿ãŒåãVâ...Váµ¥ããªã²ãŒãåãŸãã¯åŒããªãŒåã§ããå ŽåãåUáµ¢ã«å¯ŸããŠã察å¿ããã«å¯ŸããŠæ£ç¢ºãªæšè« ()ãUáµ¢
12.6.3.10 æ£ç¢ºãªæšè«
å ããå Uãžã®Vã¯ã次ã®ããã«è¡ãããŸãã
Vã åºå®ãããŠããªãXᵢ㮠1 ã€ã§ããå ŽåãUã¯Xáµ¢ã®æ£ç¢ºãªå¢çã®ã»ããã«è¿œå ãããŸãããã以å€ã®å Žåã
Vâ...VâãšUâ...Uâã®ã»ããã¯ã次ã®ããããã®ã±ãŒã¹ãé©çšããããã©ããã確èªããããšã«ãã£ãŠæ±ºå®ãããŸãã-
Vã¯é ååVâ[...]ã§ãããUã¯åãã©ã³ã¯ã®é ååUâ[...]ã§ã -
Vã¯åVâ?ã§ãUã¯åUâ -
Vã¯æ§ç¯ãããåC<Vâ...Vâ>ã§ãUã¯æ§ç¯ãããåC<Uâ...Uâ>
ãããã®ã±ãŒã¹ã®ããããã該åœããå Žåãå ã«ã€ããŠã察å¿ãã
Uáµ¢ãžã®Váµ¢ãè¡ããŸãã-
ãã以å€ã®å Žåãæšè«ã¯è¡ãããŸããã
12.6.3.11 äžéæšè«
åUå ã® Vã¯ã次ã®ããã«è¡ãããŸãã
-
Vã åºå®ãããŠããªãXᵢ㮠1 ã€ã§ããå ŽåãUã¯Xáµ¢ã®äžéã»ããã«è¿œå ãããŸãã - ãã以å€ã®å Žåã
VãåVâ?ã§ãUãUâ?åã§ããå Žåã¯ãUâããVâãžã®äžéæšè«ãè¡ãããŸãã - ãã以å€ã®å Žåã
Uâ...UâãšVâ...Vâã®ã»ããã¯ã次ã®ããããã®ã±ãŒã¹ãé©çšããããã©ããã確èªããããšã«ãã£ãŠæ±ºå®ãããŸãã-
Vã¯é ååVâ[...]ã§ãããUã¯åãã©ã³ã¯ã®é ååUâ[...]ã§ã -
Vã¯ãIEnumerable<Vâ>ãICollection<Vâ>ãIReadOnlyList<Vâ>>ãIReadOnlyCollection<Vâ>ãŸãã¯IList<Vâ>ã®ããããã§ãããU㯠1 次å é ååUâ[] -
Vã¯ãæ§ç¯ãããclassãstructãinterfaceããŸãã¯delegateåC<Vâ...Vâ>ã§ããããŠããŒã¯ãªåC<Uâ...Uâ>ãååšããŸãããããŠãUïŒãŸãã¯ãUãåparameterã®å Žåããã®æå¹ãªåºåºã¯ã©ã¹ãŸãã¯ãã®æå¹ãªã€ã³ã¿ãŒãã§ãŒã¹ã»ããã®ã¡ã³ããŒïŒããinheritsã®ãããããšïŒçŽæ¥ãŸãã¯éæ¥çã«ïŒåäžã§ãããããŸãã¯C<Uâ...Uâ>ãïŒçŽæ¥ãŸãã¯éæ¥çã«ïŒå®è£ ããŸãã -
Vã¯é¢æ°ãã€ã³ã¿ãŒå (§24.3.3)delegate*<Vâ..Vâ, Vâ>ã§ãããdelegate*<Uâ..Uâ, Uâ>ãUãšåãã§ãdelegate*<Uâ..Uâ, Uâ>ã®åŒã³åºãèŠåãVãšåãã§ãããUã®åç §ãVáµ¢ãšåãã«ãªãããã«ã颿°ãã€ã³ã¿ãŒåUáµ¢ããããŸããæ³š: ããã¯å®å šã§ãªãã³ãŒãã«ã®ã¿é©çšãããŸãã æ³šé
- ("äžææ§" å¶éã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã
C<T>{} class U: C<X>, C<Y>{}å ŽåãUããC<T>ãžã®æšè«ã§ã¯ãUâãXãŸãã¯Yå¯èœæ§ããããããæšè«ã¯è¡ãããŸããããããã®ã±ãŒã¹ã®ãããããé©çšãããå Žåãæ¬¡ã®ããã«ãåUáµ¢ãã察å¿ããVáµ¢ãžã®æšè«ãè¡ãããŸãã -
Uáµ¢ãåç §åã§ããããšãäžæãªå Žåã¯ãæ£ç¢ºãªæšè«ãè¡ãããŸãããŸãã¯ãUã颿°ãã€ã³ã¿ãŒåã§ã¯ãªããUáµ¢ãåç §åã§ããããšãäžæãªå ŽåããŸãã¯Uã颿°ãã€ã³ã¿ãŒåã§ãããUáµ¢ã颿°ãã€ã³ã¿ãŒåãŸãã¯åç §åã§ããããšãäžæãªå Žåã¯ãæ£ç¢ºãªæšè«ãè¡ãããŸããæ³š: ããã¯å®å šã§ãªãã³ãŒãã«ã®ã¿é©çšãããŸãã æ³šé
- ãã以å€ã®å Žåã
Uãé ååã®å Žåã¯ã äžéæšè« ãè¡ãããŸã - ãã以å€ã®å Žåã
VãC<Vâ...Vâ>å Žåãæšè«ã¯i-thã®Cåãã©ã¡ãŒã¿ãŒã«äŸåããŸãã- å ±å€ã®å Žåã äžéæšè« ãè¡ãããŸãã
- åå€ã®å Žåã¯ã äžéæšè« ãè¡ãããŸãã
- äžå€ã®å Žåã¯ã æ£ç¢ºãªæšè« ãè¡ãããŸãã
- ãã以å€ã®å Žåã
Vãdelegate*<Vâ..Vâ, Vâ>å Žåãæšè«ã¯delegate*<Vâ..Vâ, Vâ>ã® i çªç®ã®ãã©ã¡ãŒã¿ãŒã«äŸåããŸãã- V1 ã®å Žå:
- æ»ãå€ãå€ã«ããå Žåã¯ãäžéæšè«ãè¡ãããŸãã
- æ»ãå€ãåç §ã§ããå Žåã¯ãæ£ç¢ºãªæšè«ãè¡ãããŸãã
- V2 ã®å Žå..Vk:
- ãã©ã¡ãŒã¿ãŒãå€ã«ããå Žåã¯ãäžéæšè«ãè¡ãããŸãã
- ãã©ã¡ãŒã¿ãŒãåç §ã§ããå Žåã¯ãæ£ç¢ºãªæšè«ãè¡ãããŸãã
泚: ããã¯å®å šã§ãªãã³ãŒãã«ã®ã¿é©çšãããŸãã æ³šé
- V1 ã®å Žå:
-
- ãã以å€ã®å Žåãæšè«ã¯è¡ãããŸããã
12.6.3.12 äžéæšè«
åUå ã® Vã¯ã次ã®ããã«è¡ãããŸãã
-
Vã åºå®ãããŠããªãXᵢ㮠1 ã€ã§ããå ŽåãUã¯Xáµ¢ã®äžéã»ããã«è¿œå ãããŸãã - ãã以å€ã®å Žåã
Vâ...VâãšUâ...Uâã®ã»ããã¯ã次ã®ããããã®ã±ãŒã¹ãé©çšããããã©ããã確èªããããšã«ãã£ãŠæ±ºå®ãããŸãã-
Uã¯é ååUâ[...]ã§ãããVã¯åãã©ã³ã¯ã®é ååVâ[...]ã§ã -
Uã¯ãIEnumerable<Uâ>ãICollection<Uâ>ãIReadOnlyList<Uâ>ãIReadOnlyCollection<Uâ>ãŸãã¯IList<Uâ>ã®ããããã§ãããV㯠1 次å é ååVâ[] -
Uã¯åU1?ã§ãVã¯åV1? -
Uã¯ãã¯ã©ã¹ãæ§é äœãã€ã³ã¿ãŒãã§ã€ã¹ããŸãã¯ããªã²ãŒãåã§ããC<Uâ...Uâ>ã§ãããVã¯class, struct, interfaceåãŸãã¯delegateåã§ãããidenticalã«çŽæ¥ãŸãã¯éæ¥çã«é¢é£ããinheritsããæŽŸçããäžæãªåC<Vâ...Vâ>ã (çŽæ¥ãŸãã¯éæ¥çã«) å®è£ ããŠããŸãã -
Uã¯é¢æ°ãã€ã³ã¿ãŒå (§24.3.3) ã§ãdelegate*<Uâ..Uâ, Uâ>ããVã¯delegate*<Vâ..Vâ, Vâ>ãšåã颿°ãã€ã³ã¿ãŒåã§ãããUã®åŒã³åºãèŠåã¯Vãšåãã§ãããUáµ¢ã®åç §ã¯Váµ¢ãšåãã§ããæ³š: ããã¯å®å šã§ãªãã³ãŒãã«ã®ã¿é©çšãããŸãã æ³šé
- ("äžææ§" å¶éã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã
C<T>{} class V<Z>: C<X<Z>>, C<Y<Z>>{}ããããšãC<Uâ>ããV<Q>ãžã®æšè«æã«æšè«ãè¡ãããªãããšãæå³ããŸããæšè«ã¯ãUâããX<Q>ãŸãã¯Y<Q>) ã«å¯ŸããŠè¡ãããŸããããããã®ã±ãŒã¹ã®ãããããé©çšãããå Žåãæ¬¡ã®ããã«ãåUáµ¢ãã察å¿ããVáµ¢ãžã®æšè«ãè¡ãããŸãã -
Uã颿°ãã€ã³ã¿ãŒåã§ã¯ãªããUáµ¢ãåç §åã§ããããšãäžæãªå ŽåããŸãã¯Uã颿°ãã€ã³ã¿ãŒåã§ãããUáµ¢ã颿°ãã€ã³ã¿ãŒåãŸãã¯åç §åã§ããããšãäžæãªå Žåã¯ãæ£ç¢ºãªæšè«ãè¡ãããŸããæ³š: 颿°ãã€ã³ã¿ãŒåé¢é£ã®ããã¹ãã¯ãå®å šã§ãªãã³ãŒãã§ã®ã¿é©çšã§ããŸãã æ³šé
- ãã以å€ã®å Žåã
Vãé ååã®å Žåã¯ã äžéæšè« ãè¡ãããŸã - ãã以å€ã®å Žåã
UãC<Uâ...Uâ>å Žåãæšè«ã¯i-thã®Cåãã©ã¡ãŒã¿ãŒã«äŸåããŸãã- å ±å€ã®å Žåã¯ã äžéæšè« ãè¡ãããŸãã
- åå€ã®å Žåã äžéæšè« ãè¡ãããŸãã
- äžå€ã®å Žåã¯ã æ£ç¢ºãªæšè« ãè¡ãããŸãã
-
- ãã以å€ã®å Žåã
Uãdelegate*<Uâ..Uâ, Uâ>å Žåãæšè«ã¯delegate*<Uâ..Uâ, Uâ>ã® i çªç®ã®ãã©ã¡ãŒã¿ãŒã«äŸåããŸãã-
U1å Žå:- æ»ãå€ãå€ã®å Žåã¯ãäžéæšè«ãè¡ãããŸãã
- æ»ãå€ãåç §ã§ããå Žåã¯ãæ£ç¢ºãªæšè«ãè¡ãããŸãã
-
U2..Ukã®å Žå:- ãã©ã¡ãŒã¿ãŒãå€ã«ããå Žåã¯ãäžéæšè«ãè¡ãããŸãã
- ãã©ã¡ãŒã¿ãŒãåç §ã§ããå Žåã¯ãæ£ç¢ºãªæšè«ãè¡ãããŸãã
泚: ããã¯å®å šã§ãªãã³ãŒãã«ã®ã¿é©çšãããŸãã æ³šé
-
- ãã以å€ã®å Žåãæšè«ã¯è¡ãããŸããã
12.6.3.13 ä¿®æ£
äžé£ã®å¢çãæã€æªåºå®å倿° Xáµ¢ ã¯ã次ã®ããã«åºå®ãããŸãã
-
åè£ã®åã®ã»ãã
Uâã¯ãå¿å颿°åã§ãªãåãããå Žåãäžéã§å¿å颿°åãç¡èŠãããXáµ¢ã®å¢çã»ããå ã®ãã¹ãŠã®åã®ã»ãããšããŠéå§ãããŸãã -
Xáµ¢ã®åãã€ã³ããé çªã«èª¿ã¹ãããXáµ¢ã®æ£ç¢ºãªãã€ã³ãããã U ããšã«ãUâãšåãã§ã¯ãªããã¹ãŠã®åUãåè£ã»ããããåé€ãããŸããUãã¹ãŠã®åXᵢ㮠å lower boundUâã®å Žåã ããã®æé»ç倿ã¯ãåè£äžåŒããåé€UãXáµ¢ãã¹ãŠã®åUâã®å upper bound U ã®å Žåã ãžã®æé»ã®å€æã¯ãåè£äžåŒããåé€Uã - æ®ãã®åè£å
Uâå ã«ãä»ã®ãã¹ãŠã®åè£åããã®æé»çãªå€æãããäžæã®åVãããå ŽåãXáµ¢ã¯Vã«åºå®ãããŸãã - ãã以å€ã®å Žåãåã®æšè«ã¯å€±æããŸãã
12.6.3.14 æšè«ãããæ»ãå€ã®å
F å¿å颿°ã®æšè«ãããæ»ãå€ã®åã¯ãåã®æšè«ãšãªãŒããŒããŒãã®è§£æ±ºäžã«äœ¿çšãããŸãã æšè«ãããæ»ãå€ã®åã¯ããã¹ãŠã®ãã©ã¡ãŒã¿ãŒåãæ¢ç¥ã§ããå¿å颿°ã«å¯ŸããŠã®ã¿æ±ºå®ã§ããŸããããã¯ãæç€ºçã«æå®ãããŠããããããå¿å颿°å€æã«ãã£ãŠæäŸãããããå€åŽã®ãžã§ããªã㯠ã¡ãœããåŒã³åºãã§åæšè«äžã«æšè«ãããããã§ãã
æšå®ãããæå¹ãªæ»ãå€ã®å ã¯ã次ã®ããã«æ±ºå®ãããŸãã
-
Fã®æ¬äœãåãæã€ åŒ ã§ããå ŽåãFã®æšå®æå¹ãªæ»ãå€ã®åã¯ãã®åŒã®åã«ãªããŸãã -
Fã®æ¬äœããããã¯ã§ããããããã¯ã®returnã¹ããŒãã¡ã³ãå ã®åŒã®ã»ããã«æãäžè¬çãªåT(§12.6.3.17) ãããå Žåãæšå®ãããFã®æå¹ãªæ»ãå€ã®åã¯Tã - ãã以å€ã®å Žåã
Fã®æå¹ãªæ»ãå€ã®åãæšè«ã§ããŸããã
æšå®ãããæ»ãå€ã®å ã¯ã次ã®ããã«æ±ºå®ãããŸãã
-
Fãéåæã§ãFã®æ¬äœã nothing (§12.2) ãšããŠåé¡ãããåŒã§ãããããŸãã¯returnã¹ããŒãã¡ã³ãã«åŒããªããããã¯ã§ããå Žåãæšè«ãããæ»ãå€ã®åã¯Â«TaskType»ãããŸã (§15.14.1)ã -
Fãéåæã§ãæšå®ãããæå¹ãªæ»ãå€ã®åTãããå Žåãæšè«ãããæ»ãå€ã®åã¯Â«TaskType»<T>»(§15.14.1) ã«ãªããŸãã -
Fãéåæã§ãæšå®ãããæå¹ãªæ»ãå€ã®åãTã®å Žåãæšè«ãããæ»ãå€ã®åã¯Tã§ãã - ãã以å€ã®å Žåã¯ã
Fã®æ»ãå€ã®åãæšè«ã§ããŸããã
äŸ: å¿å颿°ãå«ãåæšè«ã®äŸãšããŠã
Selectã¯ã©ã¹ã§å®£èšãããŠããSystem.Linq.Enumerableæ¡åŒµã¡ãœãããèããŠã¿ãŸããããnamespace System.Linq { public static class Enumerable { public static IEnumerable<TResult> Select<TSource,TResult>( this IEnumerable<TSource> source, Func<TSource,TResult> selector) { foreach (TSource element in source) { yield return selector(element); } } } }
System.Linqåå空éãusing namespaceãã£ã¬ã¯ãã£ãã䜿çšããŠã€ã³ããŒããããCustomeråã®Nameããããã£ãæã€ã¯ã©ã¹stringãäžããããå ŽåãSelectã¡ãœããã䜿çšããŠé¡§å®¢ã®äžèЧã®ååãéžæã§ããŸããList<Customer> customers = GetCustomerList(); IEnumerable<string> names = customers.Select(c => c.Name);ã®æ¡åŒµã¡ãœããåŒã³åºãïŒ
SelectïŒã¯ãåŒã³åºããéçã¡ãœããåŒã³åºãã«æžãæããããšã«ãã£ãŠåŠçãããŸããIEnumerable<string> names = Enumerable.Select(customers, c => c.Name);ååŒæ°ã¯æç€ºçã«æå®ãããŠããªããããååŒæ°ãæšè«ããããã«åæšè«ã䜿çšãããŸãã ãŸããcustomers åŒæ°ã¯ãœãŒã¹ ãã©ã¡ãŒã¿ãŒã«é¢é£ãã
TSourceãCustomerãšæšè«ããŸãã æ¬¡ã«ãåè¿°ã®å¿å颿°åæšè«ããã»ã¹ã䜿çšããŠãcåCustomerãäžããããåŒc.Nameã¯ã»ã¬ã¯ã¿ãŒ ãã©ã¡ãŒã¿ãŒã®æ»ãå€ã®åã«é¢é£ããTResultãããstringãæšè«ããã ãããã£ãŠãåŒã³åºãã¯Sequence.Select<Customer,string>(customers, (Customer c) => c.Name)ãããŠçµæã¯
IEnumerable<string>åã§ããæ¬¡ã®äŸã¯ãå¿å颿°åã®æšè«ã§ããžã§ããªã㯠ã¡ãœããåŒã³åºãã®åŒæ°éã§åæ å ±ã "ãããŒ" ã§ããããã«ããæ¹æ³ã瀺ããŠããŸãã æ¬¡ã®ã¡ãœãããšåŒã³åºããæå®ããŸãã
class A { static Z F<X,Y,Z>(X value, Func<X,Y> f1, Func<Y,Z> f2) { return f2(f1(value)); } static void M() { double hours = F("1:15:30", s => TimeSpan.Parse(s), t => t.TotalHours); } }åŒã³åºãã®åæšè«ã¯æ¬¡ã®ããã«ç¶è¡ãããŸãããŸããåŒæ°ã1:15:30ã㯠value ãã©ã¡ãŒã¿ãŒã«é¢é£ãã
XãstringãšããŠæšè«ãããŸãã æ¬¡ã«ãæåã®å¿å颿°ã®ãã©ã¡ãŒã¿ãŒsã«ã¯æšè«ãããåstringãäžããããåŒTimeSpan.Parse(s)ã¯f1ã®æ»ãå€ã®åãšé¢é£ããŠãããYãSystem.TimeSpanã§ããããšãæšè«ãããŸãã æåŸã«ã2 çªç®ã®å¿å颿°ã®ãã©ã¡ãŒã¿ãŒtã«ã¯æšè«ãããåSystem.TimeSpanãäžããããåŒt.TotalHoursã¯f2ã®æ»ãå€ã®åã«é¢é£ä»ããããZãdoubleã§ãããšæšè«ãããŸãã ãããã£ãŠãåŒã³åºãã®çµæã¯doubleåã«ãªããŸããçµäºãµã³ãã«
12.6.3.15 æç€ºçãªæ»ãå€ã®åæšè«
æç€ºçãªæ»ãå€ã®åæšè«ã¯ã次ã®ããã«åEåŒTè¡ãããŸãã
-
Eãæç€ºçãªæ»ãå€ã®åUáµ£ãæã€å¿å颿°ã§ãTãããªã²ãŒãåãŸãã¯æ»ãå€ã®åãVáµ£åŒããªãŒåã§ããå Žåãæ£ç¢ºãªæšè« (§12.6.3.10) ã¯Uáµ£Váµ£è¡ãããŸãã
12.6.3.16 ã¡ãœãã ã°ã«ãŒãã®å€æã®ããã®åæšè«
ãžã§ããªã㯠ã¡ãœããã®åŒã³åºããšåæ§ã«ããžã§ããªã㯠ã¡ãœãããå«ãã¡ãœãã ã°ã«ãŒã M ãç¹å®ã®ããªã²ãŒãå D ã«å€æããããšãã«ããåæšè«ãé©çšãããŸã (§10.8)ã ããã¡ãœããã
Tâ M<Xâ...Xáµ¥>(Tâ xâ ... Tâ xâ)
ãšããªã²ãŒãå M ã«å²ãåœãŠãããã¡ãœããã°ã«ãŒã D ãšçãããªããç¶æ¿åã®ã¿ã¹ã¯ã¯ãååŒæ° Sâ...Sáµ¥ ãæ€çŽ¢ãããããåŒã¯æ¬¡ã®ããã«ãªããŸãã
M<Sâ...Sáµ¥>
ã¯ããšã®äºææ§ (D) ã«ãªããŸãã
ãžã§ããªã㯠ã¡ãœããåŒã³åºãã®åæšè«ã¢ã«ãŽãªãºã ãšã¯ç°ãªãããã®å ŽåãåŒæ° åã®ã¿ããããåŒæ° åŒã¯ãããŸããã ç¹ã«ãå¿å颿°ããªããããæšè«ã®è€æ°ã®ãã§ãŒãºã¯å¿ èŠãããŸããã
代ããã«ããã¹ãŠã® Xáµ¢ ã¯ãæªåºå®ãšããŠã¿ãªãããäžéæšè«ã¯ãååŒæ°å ã®Uâã察å¿ãããã©ã¡ãŒã¿å Dè¡ãããŸãã ããããã® Xáµ¢ ã§å¢çãèŠã€ãããªãã£ãå Žåãåã®æšè«ã¯å€±æããŸãã ãã以å€ã®å Žåããã¹ãŠã® Xáµ¢ ã¯ãåæšè«ã®çµæã§ãã察å¿ãã ã«Sáµ¢ã
12.6.3.17 äžé£ã®åŒã®æãäžè¬çãªåãèŠã€ãã
å Žåã«ãã£ãŠã¯ãäžé£ã®åŒã«ã€ããŠå ±éã®åãæšè«ããå¿ èŠããããŸãã ç¹ã«ãæé»çã«åæå®ãããé åã®èŠçŽ åãšã ããã㯠æ¬äœãæã€å¿å颿°ã®æ»ãå€ã®åã¯ããã®æ¹æ³ã§èŠã€ãããŸãã
Eâ...Eáµ¥ äžé£ã®åŒã«æãäžè¬çãªåã¯ã次ã®ããã«æ±ºå®ãããŸãã
- æ°ãã ä¿®æ£ãããŠããªã å倿°
Xãå°å ¥ãããŸããã - ååŒ
Eáµ¢åºååã®æšè« (§12.6.3.8) ãããã®åŒããXã«å®è¡ãããŸãã -
X㯠åºå® (§12.6.3.13) ã§ãããå¯èœã§ããã°ãçµæã®åãæãäžè¬çãªåã§ãã - ãã以å€ã®å Žåãæšè«ã¯å€±æããŸãã
泚æ: çŽæçã«ãã®æšè«ã¯ã
void M<X>(X xâ ... X xáµ¥)ãåŒæ°ãšããŠEáµ¢ã¡ãœãããåŒã³åºããXãæšè«ããããšãšåãã§ãã æ³šé
12.6.4 ãªãŒããŒããŒãã®è§£æ±º
12.6.4.1 å šè¬
ãªãŒããŒããŒã解決ã¯ãåŒæ°ãªã¹ããšåè£é¢æ°ã¡ã³ããŒã®ã»ãããæå®ããŠåŒã³åºãæé©ãªé¢æ°ã¡ã³ããŒãéžæããããã®ãã€ã³ãã£ã³ã°æã¡ã«ããºã ã§ãã ãªãŒããŒããŒã解決ã¯ãC# å ã®æ¬¡ã®åå¥ã®ã³ã³ããã¹ãã§åŒã³åºã颿°ã¡ã³ããŒãéžæããŸãã
- invocation_expression (§12.8.10) ã§ååãä»ããããã¡ãœããã®åŒã³åºãã
- object_creation_expression (§12.8.17.2) ã§ååãä»ããããã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã®åŒã³åºãã
- element_access (§12.8.12) ãä»ããã€ã³ãã¯ãµãŒ ã¢ã¯ã»ãµãŒã®åŒã³åºãã
- åŒ (§12.4.4 ãã㳠§12.4.5) ã§åç §ãããå®çŸ©æžã¿æŒç®åãŸãã¯ãŠãŒã¶ãŒå®çŸ©æŒç®åã®åŒã³åºãã
ãããã®åã³ã³ããã¹ãã¯ãåè£é¢æ°ã¡ã³ããŒã®ã»ãããšãç¬èªã®æ¹æ³ã§åŒæ°ã®ãªã¹ããå®çŸ©ããŸãã ããšãã°ãã¡ãœããåŒã³åºãã®åè£ã®ã»ããã«ã¯ããªãŒããŒã©ã€ããšããŠããŒã¯ãããã¡ãœãã (§12.5) ã¯å«ãŸããŸãããæŽŸçã¯ã©ã¹å ã®ã¡ãœããã該åœããå Žå(§12.8.10.2)ãåºåºã¯ã©ã¹ã®ã¡ãœããã¯åè£ã«ãªããŸããã
åã¡ãœããã«ã¯ãã¡ãœãã ã°ã«ãŒãã解決ããããã»ã¹äžã«äœ¿çšãããåintã®ãªãŒããŒããŒã解決ã®åªå
é äœããããŸãã æ¢å®ã§ã¯ããã®åªå
床㯠0 ã§ãã ãã®å€ã¯ã OverloadResolutionPriorityAttribute (§23.5.15) ã䜿çšããŠèšå®ã§ããŸãã ã¡ã³ããŒã®ãªãŒããŒããŒã解決ã®åªå
é äœã¯ããã®ã¡ã³ããŒã®æå°æŽŸç宣èšããååŸãããŸãã ãªãŒããŒããŒã解決ã®åªå
é äœã¯ãåã¡ã³ããŒãå®è£
ã§ããã€ã³ã¿ãŒãã§ã€ã¹ ã¡ã³ããŒããç¶æ¿ãŸãã¯æšè«ããããã€ã³ã¿ãŒãã§ã€ã¹ ã¡ã³ã㌠Miãå®è£
ããã¡ã³ã㌠Mxãæå®ãããå ŽåãMxãšãªãŒããŒããŒã解決ã®åªå
é äœãç°ãªãMiå Žåã¯èŠåã¯çºè¡ãããŸããã
åè£é¢æ°ã¡ã³ããŒãšåŒæ°ãªã¹ããç¹å®ããããšãæé©ãªé¢æ°ã¡ã³ããŒã®éžæã¯ãã¹ãŠã®ã±ãŒã¹ã§åãã§ãã
- ãŸããåè£é¢æ°ã¡ã³ããŒã®ã»ããã¯ãæå®ãããåŒæ°ãªã¹ã (§12.6.4.2) ã«é©çšã§ãã颿°ã¡ã³ããŒã«çž®å°ãããŸãã ãã®çž®å°ã»ããã空ã®å Žåãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
- 次ã«ãåè£ã¡ã³ããŒã®çž®å°ãããã»ããã¯ãåã宣èšããããšã«ãã£ãŠã°ã«ãŒãåãããŸãã åã°ã«ãŒãå
:
- åè£é¢æ°ã®ã¡ã³ããŒã¯ããªãŒããŒããŒã解決ã®åªå é äœã§äžŠã¹æ¿ããããŸãã ã¡ã³ããŒããªãŒããŒã©ã€ãã®å ŽåããªãŒããŒããŒã解決ã®åªå é äœã¯ããã®ã¡ã³ããŒã®æäžäœã®å®£èšããååŸãããŸãã
- ãªãŒããŒããŒã解決åªå 床ã宣èšåã°ã«ãŒãå ã§æãé«ãå€ãããäœãã¡ã³ããŒã¯ãã¹ãŠåé€ãããŸãã
- ãã®åŸãåæžãããã°ã«ãŒãã¯ã該åœããåè£é¢æ°ã¡ã³ããŒã®æçµçãªã»ããã«åçµåãããŸãã
- 次ã«ãé©çšå¯èœãªåè£é¢æ°ã¡ã³ããŒã®ã»ããããæé©ãªé¢æ°ã¡ã³ããŒãé 眮ãããŸãã ã»ããã«å«ãŸãã颿°ã¡ã³ããŒã 1 ã€ã ãã®å Žåããã®é¢æ°ã¡ã³ããŒãæé©ãªé¢æ°ã¡ã³ããŒã«ãªããŸãã ãã以å€ã®å Žåãå颿°ã¡ã³ããŒã §12.6.4.3ã® ã«ãŒã«ã䜿çšããŠä»ã®ãã¹ãŠã®é¢æ°ã¡ã³ããŒãšæ¯èŒãããå Žåãç¹å®ã®åŒæ°ãªã¹ãã«é¢ããŠä»ã®ãã¹ãŠã®é¢æ°ã¡ã³ããŒãããåªããŠãã 1 ã€ã®é¢æ°ã¡ã³ããŒãæé©ãªé¢æ°ã¡ã³ããŒã«ãªããŸãã ä»ã®ãã¹ãŠã®é¢æ°ã¡ã³ããŒãããåªãã颿°ã¡ã³ããŒã 1 ã€ã ãååšããªãå Žåã颿°ã¡ã³ããŒã®åŒã³åºãã¯ãããŸãã«ãªãããã€ã³ãæãšã©ãŒãçºçããŸãã
次ã®ãµãã¯ã©ãŠã¹ã¯ãçšèª é©çšå¯èœãªé¢æ°ã¡ã³ã㌠㚠ããåªãã颿°ã¡ã³ããŒã®æ£ç¢ºãªæå³ãå®çŸ©ããŸãã
12.6.4.2 該åœãã颿°ã¡ã³ããŒ
颿°ã¡ã³ããŒã¯ã次ã®ãã¹ãŠãçã§ããå Žåã«ãé©çšå¯èœãªé¢æ°ã¡ã³ã㌠ã A åŒæ°ãªã¹ãã«é¢ããŠé©çšå¯èœã§ãããšèšãããŸãã
-
Aã®ååŒæ°ã¯ã §12.6.2.2ã§èª¬æãããŠããããã«ã颿°ã¡ã³ããŒå®£èšã®ãã©ã¡ãŒã¿ãŒã«å¯Ÿå¿ããæå€§ 1 ã€ã®åŒæ°ãåãã©ã¡ãŒã¿ãŒã«å¯Ÿå¿ããåŒæ°ã察å¿ããªããã©ã¡ãŒã¿ãŒã¯çç¥å¯èœãªãã©ã¡ãŒã¿ãŒã§ãã -
Aã®ååŒæ°ã«ã€ããŠãåŒæ°ã®ãã©ã¡ãŒã¿ãŒåãæž¡ãã¢ãŒãã¯ã察å¿ãããã©ã¡ãŒã¿ãŒã®ãã©ã¡ãŒã¿ãŒåãæž¡ãã¢ãŒããšåãã§ãããããŠ- å€ãã©ã¡ãŒã¿ãŒãŸãã¯ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ã®å Žåã¯ãåŒæ°åŒãã察å¿ãããã©ã¡ãŒã¿ãŒã®åãžã®æé»çãªå€æ (§10.2) ãååšããŸãã
- åãæ§é äœåã§ããåç §ãã©ã¡ãŒã¿ãŒã®å Žåã¯ãåŒæ°ãã察å¿ãããã©ã¡ãŒã¿ãŒã®åãžã®æé»çãªè£éæååãã³ãã©ãŒå€æãååšããŸãã
- åç §ãã©ã¡ãŒã¿ãŒãŸãã¯åºåãã©ã¡ãŒã¿ãŒã®å Žåã¯ãåŒæ°åŒã®å (ååšããå Žå) ãšå¯Ÿå¿ãããã©ã¡ãŒã¿ãŒã®åã®éã« ID 倿ããããŸãã
- å
¥åãã©ã¡ãŒã¿ã®å Žåã§ã察å¿ããåŒæ°ã«
in修食åãããå ŽåãåŒæ°åŒã®å (ååšããå Žå) ãšå¯Ÿå¿ãããã©ã¡ãŒã¿ãŒã®åã®éã« ID 倿ããããã - åŒæ°ã
in修食åãçç¥ããå Žåããã®åŒæ°åŒãã察å¿ãããã©ã¡ãŒã¿ãŒã®åãžã®æé»çãªå€æ (§10.2) ãååšããŸãã -
ref readonlyãã©ã¡ãŒã¿ãŒã®å Žåã察å¿ããåŒæ°ãref修食åãçç¥ãããšãåŒæ°åŒãã察å¿ãããã©ã¡ãŒã¿ãŒã®åãžã®æé»çãªå€æ (§10.2) ãååšããŸãã
ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ãå«ã颿°ã¡ã³ããŒã®å Žåã颿°ã¡ã³ããŒãäžèšã®èŠåã§é©çšã§ããå Žåã¯ã éåžžã®åœ¢åŒã§é©çšå¯èœã§ãããšèšãããŸãã ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ãå«ã颿°ã¡ã³ããŒãéåžžã®åœ¢åŒã§é©çšã§ããªãå Žåã颿°ã¡ã³ããŒã¯ä»£ããã«ã
- å±éããããã©ãŒã ã¯ã颿°ã¡ã³ããŒå®£èšã®ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ããã³ã¬ã¯ã·ã§ã³ã®èŠçŽ åã® 0 å以äžã®å€ãã©ã¡ãŒã¿ãŒã«çœ®ãæããŠãåŒæ°ãªã¹ãå
ã®åŒæ°ã®æ°
Aãã©ã¡ãŒã¿ãŒã®åèšæ°ãšäžèŽããŸããAã颿°ã¡ã³ããŒå®£èšã®åºå®ãã©ã¡ãŒã¿ãŒã®æ°ãããå°ãªãåŒæ°ãæã€å Žåã颿°ã¡ã³ããŒã®æ¡åŒµåœ¢åŒãæ§ç¯ã§ããªããããé©çšã§ããŸããã - 次ã«ç€ºãããããã®æ¡ä»¶ã
Aå ã®ååŒæ°ã«åœãŠã¯ãŸãå Žåãå±éããã圢åŒãé©çšãããŸãã- åŒæ°ã®ãã©ã¡ãŒã¿ãŒåãæž¡ãã¢ãŒãã¯ã察å¿ãããã©ã¡ãŒã¿ãŒã®ãã©ã¡ãŒã¿ãŒåãæž¡ãã¢ãŒããšåãã§ãã
- åºå®å€ãã©ã¡ãŒã¿ãŒãŸãã¯æ¡åŒµã«ãã£ãŠäœæãããå€ãã©ã¡ãŒã¿ãŒã®å ŽåãåŒæ°åŒãã察å¿ãããã©ã¡ãŒã¿ãŒã®åãžã®æé»çãªå€æ (§10.2) ãååšããŸããåã¯
-
inãoutããŸãã¯refãã©ã¡ãŒã¿ãŒã®å ŽåãåŒæ°åŒã®åã¯ã察å¿ãããã©ã¡ãŒã¿ãŒã®åãšåãã§ãã
- åŒæ°ã®ãã©ã¡ãŒã¿ãŒåãæž¡ãã¢ãŒãã value ã§ããã察å¿ãããã©ã¡ãŒã¿ãŒã®ãã©ã¡ãŒã¿ãŒåãæž¡ãã¢ãŒããå
¥åãŸãã¯
ref readonlyã§ãããåŒæ°åŒãã察å¿ãããã©ã¡ãŒã¿ãŒã®åãžã®æé»çãªå€æ (§10.2) ãååšããŸãã
- åŒæ°ã®ãã©ã¡ãŒã¿ãŒåãæž¡ãã¢ãŒãã¯ã察å¿ãããã©ã¡ãŒã¿ãŒã®ãã©ã¡ãŒã¿ãŒåãæž¡ãã¢ãŒããšåãã§ãã
åŒæ°ã®åããå ¥åãã©ã¡ãŒã¿ãŒã®ãã©ã¡ãŒã¿ãŒåãžã®æé»çãªå€æãåçæé»çãªå€æ (§10.2.10) ã§ããå Žåãçµæã¯æªå®çŸ©ã«ãªããŸãã
äŸ: 次ã®å®£èšãšã¡ãœããåŒã³åºããæå®ããŸãã
public static void M1(int p1) { ... } public static void M1(in int p1) { ... } public static void M2(in int p1) { ... } public static void Test() { int i = 10; uint ui = 34U; M1(in i); // M1(in int) is applicable M1(in ui); // no exact type match, so M1(in int) is not applicable M1(i); // M1(int) and M1(in int) are applicable M1(i + 5); // M1(int) and M1(in int) are applicable M1(100u); // no implicit conversion exists, so M1(int) is not applicable M2(in i); // M2(in int) is applicable M2(i); // M2(in int) is applicable M2(i + 5); // M2(in int) is applicable }çµäºãµã³ãã«
- éçã¡ãœããã¯ãã¡ãœãã ã°ã«ãŒããåãä»ã㊠simple_name ãŸã㯠member_access ããã®çµæã§ããå Žåã«ã®ã¿é©çšãããŸãã
- ã€ã³ã¹ã¿ã³ã¹ ã¡ãœããã¯ãã¡ãœãã ã°ã«ãŒãã®çµæã simple_nameã倿°ãŸãã¯å€ãä»ãã member_access ãŸã㯠base_accessã®å Žåã«ã®ã¿é©çšãããŸãã
- ã¡ãœãã ã°ã«ãŒãã simple_nameã®çµæã§ããå Žåãã€ã³ã¹ã¿ã³ã¹ ã¡ãœããã¯ã
thisã¢ã¯ã»ã¹ãèš±å¯ãããŠããå Žåã«ã®ã¿é©çšãããŸã§12.8.14ã
- ã¡ãœãã ã°ã«ãŒãã simple_nameã®çµæã§ããå Žåãã€ã³ã¹ã¿ã³ã¹ ã¡ãœããã¯ã
- §12.8.7.2 ã§èª¬æãããŠããããã«ãã¡ãœãã ã°ã«ãŒããã€ã³ã¹ã¿ã³ã¹ãŸãã¯åã®ãããããä»ããŠå®è¡ã§ãã member_accessããåŸãããå Žåãã€ã³ã¹ã¿ã³ã¹ã¡ãœãããšéçã¡ãœããã®äž¡æ¹ãé©çšãããŸãã
- ååŒæ° (æç€ºçã«æå®ãŸãã¯æšè«) ãå¶çŽãæºãããŠããªããžã§ããªã㯠ã¡ãœããã¯é©çšã§ããŸããã
- ã¡ãœãã ã°ã«ãŒã倿ã®ã³ã³ããã¹ãã§ã¯ãã¡ãœããã®æ»ãå€ã®åããããªã²ãŒãã®æ»ãå€ã®åãžã® ID 倿 (§10.2.2) ãŸãã¯æé»çãªåç §å€æ (§10.2.8) ãååšããå¿ èŠããããŸãã ãã以å€ã®å Žåãåè£ã¡ãœããã¯é©çšãããŸããã
12.6.4.3 ãã¿ãŒé¢æ°ã¡ã³ããŒ
ããåªãã颿°ã¡ã³ããŒã決å®ããããã«ãåé€ãããåŒæ°ãªã¹ã A ã¯ãå
ã®åŒæ°ãªã¹ãã«è¡šç€ºãããé åºã§åŒæ°åŒèªäœã ããå«ã¿ãout ãŸã㯠ref åŒæ°ãé€å€ããŠæ§ç¯ãããŸãã
ååè£é¢æ°ã¡ã³ããŒã®ãã©ã¡ãŒã¿ãŒ ãªã¹ãã¯ã次ã®ããã«æ§ç¯ãããŸãã
- å±éãã©ãŒã ã¯ã颿°ã¡ã³ããŒãå±éãã©ãŒã ã§ã®ã¿é©çšãããå Žåã«äœ¿çšãããŸãã
- 察å¿ããåŒæ°ã®ãªãçç¥å¯èœãªãã©ã¡ãŒã¿ãŒã¯ããã©ã¡ãŒã¿ãŒ ãªã¹ãããåé€ãããŸã
- ãã©ã¡ãŒã¿ãŒ ãªã¹ãããåç §ãã©ã¡ãŒã¿ãŒãšåºåãã©ã¡ãŒã¿ãŒãåé€ããã
- ãã©ã¡ãŒã¿ãŒã¯ãåŒæ°ãªã¹ãå ã®å¯Ÿå¿ããåŒæ°ãšåãäœçœ®ã«é 眮ãããããã«äžŠã¹æ¿ããããŸãã
åŒæ°åŒã®ã»ãã A ãšãã©ã¡ãŒã¿å {Eâ, Eâ, âŠ, Eáµ¥} ãš Máµ¥ãæã€2ã€ã®é©çšå¯èœãªé¢æ°ã¡ã³ã㌠Mâ ãš {Pâ, Pâ, âŠ, Páµ¥} ãå«ãåŒæ°ãªã¹ã {Qâ, Qâ, âŠ, Qáµ¥} ãäžããããå Žåã Máµ¥ 㯠ããã ã§ãããšå®çŸ©ãããŸãã
ååŒæ°ã«å¯ŸããŠã
Eáµ¥ããPáµ¥ãžã®æé»çãªå€æã¯å¿å颿°åã®å€æã§ã¯ãªãã-
Máµ¥ã¯éãžã§ããªã㯠ã¡ãœãããŸãã¯Máµ¥åãã©ã¡ãŒã¿ãŒã{Xâ, Xâ, âŠ, Xáµ¥}ãžã§ããªã㯠ã¡ãœããã§ãããååãã©ã¡ãŒã¿ãŒã«å¯ŸããŠãååŒæ°ã¯åŒãŸãã¯å¿å颿°å以å€ã®åããæšè«ãããŸãã - å°ãªããšã 1 ã€ã®åŒæ°ã®å Žåã
Eáµ¥ããQáµ¥ãžã®æé»çãªå€æã¯å¿å颿°å倿ã§ããããMâã¯åãã©ã¡ãŒã¿ãŒã{Yâ, Yâ, âŠ, Yáµ¥}ãžã§ããªã㯠ã¡ãœããã§ãããå°ãªããšã 1 ã€ã®åãã©ã¡ãŒã¿ãŒã«å¯ŸããŠãååŒæ°ã¯å¿å颿°åããæšè«ãããŸãã
-
ååŒæ°ã«å¯ŸããŠã
Eáµ¥ããQáµ¥ãžã®æé»çãªå€æã¯ãEáµ¥ããPáµ¥ãžã®æé»çãªå€æãããé©ããŠããŸãããå°ãªããšã 1 ã€ã®åŒæ°ã®å Žåã
Eáµ¥ããPáµ¥ãžã®å€æã¯ãEáµ¥ããQáµ¥ãžã®å€æãããåªããŠããŸãã
ãã©ã¡ãŒã¿ãŒåã·ãŒã±ã³ã¹ {Pâ, Pâ, âŠ, Páµ¥} ãš {Qâ, Qâ, âŠ, Qáµ¥} ãçããå Žå (ã€ãŸããå Páµ¢ ã察å¿ãã Qáµ¢ãžã® ID 倿ãæã€å Žå)ãããé©åãªé¢æ°ã¡ã³ããŒã決å®ããããã«ã次ã®ã¿ã€ãã¬ãŒã¯ ã«ãŒã«ãé©çšãããŸãã
-
Máµ¢ãéãžã§ããªã㯠ã¡ãœããã§ãããMâããžã§ããªã㯠ã¡ãœããã§ããå ŽåãMáµ¢ã¯MâãããåªããŠããŸãã - ãã以å€ã®å Žåã
Máµ¢ãéåžžã®åœ¢åŒã§é©çšãããMâã«ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ããããå±éããããã©ãŒã ã§ã®ã¿é©çšã§ããå Žåã¯ãMâãããMáµ¢ãé©ããŠããŸãã - ãã以å€ã®å Žåãäž¡æ¹ã®ã¡ãœããã«ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ããããå±éããããã©ãŒã ã§ã®ã¿é©çšã§ããå Žåãããã³
Máµ¢ã®ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ã®èŠçŽ ãMâã®ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ãããå°ãªãå Žåã¯ãMâãããMáµ¢ãé©ããŠããŸãã - ãã以å€ã®å Žåã
Máµ¥ã«Mâãããå ·äœçãªãã©ã¡ãŒã¿ãŒåãããå Žåã¯ãMáµ¥ã¯MâãããåªããŠããŸãã{R1, R2, âŠ, Rn}ãš{S1, S2, âŠ, Sn}ã¯ãMáµ¥ãšMâã®æªã€ã³ã¹ã¿ã³ã¹åããã³æªå±éã®ãã©ã¡ãŒã¿ãŒåã衚ããŸããMáµ¥ã®ãã©ã¡ãŒã¿ ã¿ã€ãã¯ãåãã©ã¡ãŒã¿ã«ã€ããŠMâãRxããå ·äœçã§ãªããå°ãªããšã 1 ã€ã®ãã©ã¡ãŒã¿ã«ã€ããŠSxãRxããå ·äœçã§ããå ŽåãSxã®ãã©ã¡ãŒã¿ ã¿ã€ãããå ·äœçã§ãã- åãã©ã¡ãŒã¿ãŒã¯ãå以å€ã®ãã©ã¡ãŒã¿ãŒãããå ·äœçã§ã¯ãããŸããã
- æ§ç¯ãããåãä»ã®æ§ç¯åïŒåãæ°ã®ååŒæ°ãæã€ïŒããå ·äœçãšãããã®ã¯ãå°ãªããšã1ã€ã®ååŒæ°ãããå ·äœçã§ããã€ã©ã®ååŒæ°ãä»ã®åã®å¯Ÿå¿ããååŒæ°ããå ·äœçã§ãªãããšããªãå Žåã§ãã
- é ååã¯ã1 ã€ç®ã®èŠçŽ åã 2 çªç®ã®èŠçŽ åãããå ·äœçãªå Žåã(æ¬¡å æ°ãåã) å¥ã®é ååãããå ·äœçã§ãã
- ãã以å€ã®å Žåã¯ã1 ã€ã®ã¡ã³ããŒãéãªããæŒç®åã§ãããäžæ¹ããªãããããæŒç®åã§ããå Žåã¯ãéãªããæŒç®åã®æ¹ãé©ããŠããŸãã
- ã©ã¡ãã®é¢æ°ã¡ã³ããŒãè¯å¥œã§ãªãã
Máµ¥ã®ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒã«å¯Ÿå¿ããåŒæ°ãããã®ã«å¯Ÿããæ¢å®ã®åŒæ°ã¯Mâã®å°ãªããšã 1 ã€ã®çç¥å¯èœãªãã©ã¡ãŒã¿ãŒã«çœ®ãæããå¿ èŠãããå ŽåãMáµ¥ã¯MâãããåªããŠããŸãã - å°ãªããšã 1 ã€ã®ãã©ã¡ãŒã¿ãŒ
Máµ¥ã§ã ã®å¯Ÿå¿ãããã©ã¡ãŒã¿ãŒããã åªãããã©ã¡ãŒã¿ãŒããã·ã³ã°éžæ (Mâ)ã䜿çšããMâã®ã©ã®ãã©ã¡ãŒã¿ãŒãMáµ¥ãããåªãããã©ã¡ãŒã¿ãŒæž¡ãã®éžæè¢ã䜿çšããªãå ŽåãMáµ¥ã¯MâãããåªããŠããŸãã - ãã以å€ã®å Žåãäž¡æ¹ã®ã¡ãœããã«ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ããããå±éããããã©ãŒã ã§ã®ã¿é©çšã§ããå ŽåãåãåŒæ°ã®ã»ãããäž¡æ¹ã®ã¡ãœããã®ã³ã¬ã¯ã·ã§ã³èŠçŽ ã«å¯Ÿå¿ããæ¬¡ã®ããããã®ä¿çãããå Žåã
Máµ¢ã¯MâãããåªããŠããŸãã- äž¡æ¹ã®ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ã span_typeã§ã¯ãªãã
Máµ¢ã®ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ãããã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ãžã®æé»çãªå€æãååšããŸããMâ -
Máµ¢ã®ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ãSystem.ReadOnlySpan<Eáµ¢>ãããMâã®ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ãSystem.Span<Eâ>ãããEáµ¢ããEâ -
Máµ¢ã®ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ãSystem.ReadOnlySpan<Eáµ¢>ãŸãã¯System.Span<Eáµ¢>ã§ãããMâã®ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ã¯ãèŠçŽ åãEâãããé åãŸãã¯é åã€ã³ã¿ãŒãã§ã€ã¹åã§ãããEáµ¢ãã ãžã® ID 倿ãååšããŸãEâ
- äž¡æ¹ã®ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ã span_typeã§ã¯ãªãã
- ãã以å€ã®å Žåãã©ã®é¢æ°ã¡ã³ããŒããã¿ãŒã§ã¯ãããŸããã
delegate*ã¯ãvoid*ãããå
·äœçã§ãã
泚: ããã¯å®å šã§ãªãã³ãŒãã«ã®ã¿é©çšã§ãã
void*ãšdelegate*ã®ãªãŒããŒããŒããèš±å¯ãã&æŒç®åã 2 ã€ãåºå¥ã§ããããã«ããŸãã æ³šé
12.6.4.4 ãã©ã¡ãŒã¿ãŒåãæž¡ãã¢ãŒãã®æ¹å
次ã®ããã«ã2 ã€ã®ãã©ã¡ãŒã¿ãŒã® 1 ã€ã«å€æž¡ãã¢ãŒããããå Žåã2 ã€ã®ãªãŒããŒããŒããããã¡ãœããã§å¯Ÿå¿ãããã©ã¡ãŒã¿ãŒããã©ã¡ãŒã¿ãŒæž¡ãã¢ãŒãã«ãã£ãŠã®ã¿ç°ãªãããšããããŸãã
public static void M1(int p1) { ... }
public static void M1(in int p1) { ... }
int i = 10;ã«åºã¥ããŠã㮠§12.6.4.2ã«ãããšãåŒã³åºã M1(i) ãš M1(i + 5) ã«äž¡æ¹ã®ãªãŒããŒããŒããé©çšãããŸãã ãã®ãããªå Žåãå€ã®ãã©ã¡ãŒã¿åãæž¡ãã¢ãŒããæã€ã¡ãœããã¯ãããè¯ããã©ã¡ãŒã¿åãæž¡ãã¢ãŒãã®éžæè¢ã«ãªããŸãã
泚: å ¥åãåºåããŸãã¯åç §ã®åãæž¡ãã¢ãŒãã®åŒæ°ã¯ããŸã£ããåããã©ã¡ãŒã¿ãŒã®åãæž¡ãã¢ãŒãã«ã®ã¿äžèŽããã®ã§ããã®ãããªéžæã¯å¿ èŠãããŸããã æ³šé
12.6.4.5 åŒããã®å€æã®åäž
CâåŒããåE ã«å€æããæé»çãªå€æ Tâ ãšã Câ åŒããå Eã«å€æããæé»çãªå€æ Tâ ãèãããšã 次ã®ãããããä¿æãããŠããå Žåã Câ 㯠ããã ã«ãªããŸãã
-
E㯠collection_expression ã§ãããCâã¯CâãããåŒããã®ã³ã¬ã¯ã·ã§ã³å€æã®æ¹ãåªããŠããŸã (以äžã®å®çŸ©ãåç §)ã -
E㯠collection_expression ã§ã¯ãªããæ¬¡ã®ãããããä¿æãããŸãã-
Eã¯é宿° interpolated_string_expressionã§ãããCâã¯æé»çãªè£éæååãã³ãã©ãŒå€æã§ãããTâã¯é©çšå¯èœãªè£éæååãã³ãã©ãŒåã§ãããCâã¯æé»çãªè£éæååãã³ãã©ãŒå€æã§ã¯ãããŸããã -
Câ㯠function_type_conversion ã§ã¯ãªããCâ㯠function_type_conversionã§ãã -
Eã¯Tâãšå®å šã«ã¯äžèŽãããæ¬¡ã®ãã¡å°ãªããšã 1 ã€ãä¿æãããŸãã-
ETâãšå®å šã«äžèŽããEãTâãšå®å šã«äžèŽããŸãã (§12.6.4.6)ã -
Câã¯æ¡ä»¶åŒå€æã§ã¯ãªããCâã¯æ¡ä»¶åŒã®å€æã§ãã -
ETâãšTâã®äž¡æ¹ãŸãã¯äž¡æ¹ã«å®å šã«äžèŽããTâã¯Tâ(§12.6.4.7) ãããåªãã倿ã¿ãŒã²ããã§ãããCâãšCâã¯äž¡æ¹ãšãæ¡ä»¶åŒå€æã§ããããã©ã¡ããæ¡ä»¶åŒå€æã§ããããŸããã-
Vã¯é¢æ°ãã€ã³ã¿ãŒådelegate*<Vâ..Vâ, Vâ>ã§ãUã¯é¢æ°ãã€ã³ã¿ãŒådelegate*<Uâ..Uâ, Uâ>ã§ãããVã®åŒã³åºãèŠåã¯Uãšåãã§ãããVáµ¢ã®åç §ã¯Uáµ¢ãšåãã§ããæ³š: ããã¯å®å šã§ãªãã³ãŒãã«ã®ã¿é©çšãããŸãã æ³šé
-
-
Eã¯ã¡ãœãã ã°ã«ãŒã (§12.2) ã§ãããTâã¯å€æCâã®ã¡ãœãã ã°ã«ãŒãã®åäžã®æé©ãªã¡ãœãããšäºææ§ããã (§21.4)ãTâã¯å€æCâã®ã¡ãœãã ã°ã«ãŒãã®åäžã®æé©ãªã¡ãœãããšäºææ§ããããŸããã
-
-
次ã®å Žå:
-
Eã¯ãèŠçŽ åŒãå«ãã³ã¬ã¯ã·ã§ã³åŒã§ã[ELâ, ELâ, ..., ELâ] -
TâãšTâã¯ã³ã¬ã¯ã·ã§ã³åã§ã -
Eâã¯ã次ã®èŠçŽ ã®åã§ããTâ -
Eâã¯ã次ã®èŠçŽ ã®åã§ããTâ -
CEâáµ¢ã¯ãELáµ¢ãã ãžã®äžé£ã®å€æã§ããEâ -
CEâáµ¢ã¯ãELáµ¢ãã ãžã®äžé£ã®å€æã§ããEâ
EâããEâãžã® ID 倿ãããå ŽåãèŠçŽ ã®å€æã¯äºãã«åãã«ãªããŸãã ãã以å€ã®å ŽåãEâãžã®èŠçŽ å€æã¯ã次ã®å Žåã«Eâãžã®èŠçŽ å€æãããåªããŠããŸãã
- ãã¹ãŠã®
ELáµ¢ã«ã€ããŠãCEâáµ¢ã¯å°ãªããšãCEâáµ¢ãšåããããè¯ãã§ãã -
CEâáµ¢ãåªããŠããiãå°ãªããšã1ã€ãããŸãCEâáµ¢
ãã以å€ã®å Žåãã©ã¡ãã®èŠçŽ å€æã»ãããä»ã®èŠçŽ ãããåªãããäºãã«åªããŠããããã§ã¯ãããŸããã
ELáµ¢ãæ¡æ£èŠçŽ ã§ãªãå Žåã¯ãåŒããã®ããé©åãªå€æã䜿çšããŠå€ææ¯èŒãè¡ãããŸãã
ELáµ¢ãã¹ãã¬ããèŠçŽ ã®å Žåã¯ãã¹ãã¬ãã ã³ã¬ã¯ã·ã§ã³ã®èŠçŽ åãããããããEâãŸãã¯Eâãžã®ããé©åãªå€æã䜿çšããŸãã
Câã¯ã次ã®å Žåã«CâããããããåŒããã®ã³ã¬ã¯ã·ã§ã³å€æã®æ¹ãåªããŠããŸãã
-
TâãšTâã¯ã©ã¡ããã¹ãã³åã§ã¯ãªããTâã¯æé»çã«Tâã«å€æã§ããTâã¯æé»çã«Tâã«å€æã§ããŸããã -
Eâã«ã¯Eâãžã® ID 倿ããããŸããããŸããEâãžã®èŠçŽ å€æã¯ãEâãžã®èŠçŽ å€æãããåªããŠããŸãã -
Eâã«ã¯ãEâãžã® ID 倿ããããæ¬¡ã®ãããããä¿æãããŸãã-
TâãSystem.ReadOnlySpan<Eâ>ãããTâãSystem.Span<Eâ> -
TâãSystem.ReadOnlySpan<Eâ>ãŸãã¯System.Span<Eâ>ã§ãããTâã¯èŠçŽ åãæã€array_or_array_interfaceã§ãEâ
-
ãã以å€ã®å Žåã¯ãã©ã¡ãã®ã³ã¬ã¯ã·ã§ã³åãé©ããŠããªãã®ã§ãçµæã¯ãããŸãã§ãã
äŸ: 次ã®äŸã¯ãé ååæååãšã³ã¬ã¯ã·ã§ã³åŒã®éã®ãªãŒããŒããŒã解決ã®éãã瀺ããŠããŸãã
class C { static void Generic<T>(Span<T> value) { } static void Generic<T>(T[] value) { } static void SpanDerived(Span<string> value) { } static void SpanDerived(object[] value) { } static void ArrayDerived(Span<object> value) { } static void ArrayDerived(string[] value) { } static void M() { // Array initializers Generic(new[] { "" }); // string[] SpanDerived(new[] { "" }); // ambiguous ArrayDerived(new[] { "" }); // string[] // Collection expressions Generic([""]); // Span<string> SpanDerived([""]); // Span<string> ArrayDerived([""]); // ambiguous } }çµäºãµã³ãã«
12.6.4.6 å³å¯ã«äžèŽããåŒ
åŒ E ãšå Tããæ¬¡ã®ããããã®æ¡ä»¶ãæºããå ŽåãEã¯T ãšå®å
šã«äžèŽããŸãã
-
Eã«ã¯åSããããSããTãžã® ID 倿ãååšããŸã -
Eã¯å¿å颿°ã§ãããTã¯ããªã²ãŒãåDãŸãã¯åŒããªãŒåExpression<D>ã§ãããæ¬¡ã®ãããããä¿æãããŸãã-
Xã®ãã©ã¡ãŒã¿ãŒ ãªã¹ã (E) ã®ã³ã³ããã¹ãã§Dã®æšå®æ»ãå€ã®åãååšããXããæ»ãå€ã®åãžã® ID 倿ãååšããŸãD -
Eã¯æ»ãå€ã®ãªãasyncã©ã ãã§ãããDã«ã¯éãžã§ããªãã¯Â«TaskType»ã§ããæ»ãå€ã®åããããŸã -
Eãééåæã§ãDãæ»ãå€ã®åYãæã€ããEãéåæã§Dæ»ãå€ã®åã«TaskType»<Y>(§15.14.1)ãæ¬¡ã®ãããããä¿æãããŸãã-
Eã®æ¬äœã¯ãYãšå®å šã«äžèŽããåŒã§ã -
Eã®æ¬äœã¯ããã¹ãŠã® return ã¹ããŒãã¡ã³ããYãšå®å šã«äžèŽããåŒãè¿ããããã¯ã§ãã
-
-
12.6.4.7 ã³ã³ããŒãžã§ã³ã¿ãŒã²ããã®åäž
2 çš®é¡ã®
-
TâããTâãžã®æé»çãªå€æãååšããTâããTâãžã®æé»çãªå€æã¯ååšããŸãã -
Tâã¯Â«TaskType»<Sâ>(§15.14.1)ãTâã¯Â«TaskType»<Sâ>ãSâã¯Sâããè¯ã倿å ã§ãã -
Tâã¯Â«TaskType»<Sâ>(§15.14.1)ãTâã¯Â«TaskType»<Sâ>ãTâã¯Tâããå°éçã§ãã -
Tâã¯SâãŸãã¯Sâ?ã§ãSâã¯ç¬Šå·ä»ãæŽæ°åãTâã¯SâãŸãã¯Sâ?ã§ãSâã¯ç¬Šå·ãªãæŽæ°åã§ãã å ·äœçã«ã¯:-
Sâãsbyteã§ãããSâãbyteãushortãuintãnuintããŸãã¯ulong -
Sâã¯shortã§ãSâã¯ushortãuintãnuintããŸãã¯ulongã§ã -
Sâã¯intã§ãããSâã¯uintãnuintããŸãã¯ulong -
SâãnintãããSâãnuintãŸãã¯ulong -
SâãlongãããSâãnuintãŸãã¯ulong
-
12.6.4.8 ãžã§ããªã㯠ã¯ã©ã¹ã§ã®ãªãŒããŒããŒã
泚: 宣èšãããŠããã·ã°ããã£ã¯äžæã§ããå¿ èŠããããŸãããååŒæ°ã眮æãããšåãã·ã°ããã£ã«ãªãå¯èœæ§ããããŸã (§8.6)ã ãã®ãããªç¶æ³ã§ã¯ããªãŒããŒããŒãã®è§£æ±ºã«ãããŠãå ã®ã·ã°ããã£ïŒååŒæ°ã®çœ®æåïŒã®äžã§æãå ·äœçãªãã®ãéžæãããŸãïŒååšããå ŽåïŒããããååšããªãå Žåã«ã¯ããšã©ãŒãå ±åãããŸãïŒÂ§12.6.4.3ïŒã 泚é
äŸ: 次ã®äŸã¯ããã®èŠåã«åŸã£ãŠæå¹ã§ç¡å¹ãªãªãŒããŒããŒãã瀺ããŠããŸãã
public interface I1<T> { ... } public interface I2<T> { ... } public abstract class G1<U> { public abstract int F1(U u); // Overload resolution for G<int>.F1 public abstract int F1(int i); // will pick non-generic public abstract void F2(I1<U> a); // Valid overload public abstract void F2(I2<U> a); } abstract class G2<U,V> { public abstract void F3(U u, V v); // Valid, but overload resolution for public abstract void F3(V v, U u); // G2<int,int>.F3 will fail public abstract void F4(U u, I1<V> v); // Valid, but overload resolution for public abstract void F4(I1<V> v, U u); // G2<I1<int>,int>.F4 will fail public abstract void F5(U u1, I1<V> v2); // Valid overload public abstract void F5(V v1, U u2); public abstract void F6(ref U u); // Valid overload public abstract void F6(out V v); }çµäºãµã³ãã«
12.6.5 åçã¡ã³ããŒåŒã³åºãã®ã³ã³ãã€ã«æãã§ãã¯
åçã«ãã€ã³ããããæŒç®ã®ãªãŒããŒããŒã解決ã¯å®è¡æã«è¡ãããŸãããã³ã³ãã€ã«æã«ãªãŒããŒããŒãã®éžæå ãšãªã颿°ã¡ã³ããŒã®äžèŠ§ãææ¡ã§ããå ŽåããããŸãã
- ããªã²ãŒãåŒã³åºã (§12.8.10.4) ã®å Žåããªã¹ãã¯åŒã³åºãã® delegate_type ãšåããã©ã¡ãŒã¿ãŒ ãªã¹ããæã€åäžã®é¢æ°ã¡ã³ããŒã§ã
- ã¡ãœããã®åŒã³åºã (§12.8.10.2) ã®å ŽåããŸãã¯éçãªåãåçã§ãªãå€ã®å Žåãã¡ãœãã ã°ã«ãŒãå ã®ã¢ã¯ã»ã¹å¯èœãªã¡ãœããã®ã»ããã¯ã³ã³ãã€ã«æã«èªèãããŸãã
- ãªããžã§ã¯ãäœæåŒ (§12.8.17.2) ã®å Žåãåå ã®ã¢ã¯ã»ã¹å¯èœãªã³ã³ã¹ãã©ã¯ã¿ãŒã®ã»ããã¯ã³ã³ãã€ã«æã«èªèãããŸãã
- ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ (§12.8.12.5) ã®å Žåãåä¿¡åŽã®ã¢ã¯ã»ã¹å¯èœãªã€ã³ãã¯ãµãŒã®ã»ããã¯ã³ã³ãã€ã«æã«èªèãããŸãã
ãã®ãããªå Žåã¯ãæ¢ç¥ã®é¢æ°ã¡ã³ããŒã»ããå
ã®åã¡ã³ããŒã«å¯ŸããŠå¶éä»ãã³ã³ãã€ã«æãã§ãã¯ãå®è¡ãããå®è¡æã«åŒã³åºãããããšããªãããšãããã£ãŠãããã©ããã確èªããŸãã å颿°ã¡ã³ã㌠F ã«ã€ããŠã倿Žããããã©ã¡ãŒã¿ãŒãšåŒæ°ã®ãªã¹ããæ§ç¯ãããŸãã
- æåã«ã
Fããžã§ããªã㯠ã¡ãœããã§ãããååŒæ°ãæå®ãããå Žåã¯ããã©ã¡ãŒã¿ãŒ ãªã¹ãã®åãã©ã¡ãŒã¿ãŒã«çœ®ãæããŸãã ãã ããååŒæ°ãæå®ãããŠããªãå Žåããã®ãããªçœ®æã¯è¡ãããŸããã - 次ã«ãåãéããŠãããã¹ãŠã®ãã©ã¡ãŒã¿ãŒ (ã€ãŸããåãã©ã¡ãŒã¿ãŒãå«ãŸããŠããŸãã §8.4.3 ãåç §) ã¯ã察å¿ããåŒæ°ãšå ±ã«çç¥ãããŸãã
F ããã§ãã¯ã«åæ Œããã«ã¯ã次ã®ãã¹ãŠã®æ¡ä»¶ãæºããå¿
èŠããããŸãã
-
Fã®å€æŽããããã©ã¡ãŒã¿ãŒ ãªã¹ãã¯ã §12.6.4.2ã®å€æŽãããåŒæ°ãªã¹ãã«é©çšãããŸãã - 倿Žããããã©ã¡ãŒã¿ãŒ ãªã¹ãå ã®ãã¹ãŠã®æ§ç¯ãããåã¯ããã®å¶çŽãæºãã (§8.4.5)ã
- äžèšã®æé ã§
Fã®åãã©ã¡ãŒã¿ãŒã眮ãæããããå Žåããããã®å¶çŽã¯æºããããŸãã -
Fãéçã¡ãœããã®å Žåãã¡ãœãã ã°ã«ãŒãã¯ãã³ã³ãã€ã«æã«ã¬ã·ãŒããŒã倿°ãŸãã¯å€ã§ããããšãããã£ãŠãã member_access ããçºçãããã®ã§ã¯ãããŸããã -
Fãã€ã³ã¹ã¿ã³ã¹ ã¡ãœããã®å Žåãã¡ãœãã ã°ã«ãŒãã¯ãã³ã³ãã€ã«æã«ã¬ã·ãŒããŒãåã§ããããšãããã£ãŠãã member_access ããçºçãããã®ã§ã¯ãããŸããã
ãã®ãã¹ãã«åæ Œããåè£ããªãå Žåã¯ãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
12.6.6 颿°ã¡ã³ããŒã®åŒã³åºã
12.6.6.1 å šè¬
ãã®ãµãã¯ã©ãŠãºã§ã¯ãç¹å®ã®é¢æ°ã¡ã³ããŒãåŒã³åºãããã«å®è¡æã«å®è¡ãããããã»ã¹ã«ã€ããŠèª¬æããŸãã ãã€ã³ãã£ã³ã°æããã»ã¹ã¯ãåŒã³åºãç¹å®ã®ã¡ã³ããŒãæ¢ã«æ±ºå®ããŠããããšãåæãšããŠããŸããå Žåã«ãã£ãŠã¯ãäžé£ã®åè£é¢æ°ã¡ã³ããŒã«ãªãŒããŒããŒã解決ãé©çšããŸãã
åŒã³åºãããã»ã¹ãèšè¿°ããããã«ã颿°ã¡ã³ããŒã¯æ¬¡ã® 2 ã€ã®ã«ããŽãªã«åé¡ãããŸãã
- éç颿°ã¡ã³ããŒã ãããã¯ãéçã¡ãœãããéçãããã㣠ã¢ã¯ã»ãµãŒãããã³ãŠãŒã¶ãŒå®çŸ©æŒç®åã§ãã éç颿°ã¡ã³ããŒã¯åžžã«éä»®æ³ã§ãã
- ã€ã³ã¹ã¿ã³ã¹é¢æ°ã¡ã³ããŒã ãããã¯ãã€ã³ã¹ã¿ã³ã¹ ã¡ãœãããã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒãã€ã³ã¹ã¿ã³ã¹ ãããã㣠ã¢ã¯ã»ãµãŒãããã³ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ãµãŒã§ãã ã€ã³ã¹ã¿ã³ã¹é¢æ°ã¡ã³ããŒã¯éä»®æ³ãŸãã¯ä»®æ³ã§ãããåžžã«ç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ã§åŒã³åºãããŸãã ã€ã³ã¹ã¿ã³ã¹ã¯ã€ã³ã¹ã¿ã³ã¹åŒã«ãã£ãŠèšç®ããã
this(§12.8.14) ãšããŠé¢æ°ã¡ã³ããŒå ã§ã¢ã¯ã»ã¹ã§ããããã«ãªããŸãã ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã®å Žåãã€ã³ã¹ã¿ã³ã¹åŒã¯æ°ããå²ãåœãŠããããªããžã§ã¯ãã«ãªããŸãã
颿°ã¡ã³ããŒåŒã³åºãã®å®è¡æåŠçã¯ãæ¬¡ã®æé ã§æ§æãããŸããããã§ã M ã¯é¢æ°ã¡ã³ããŒã§ããã M ãã€ã³ã¹ã¿ã³ã¹ ã¡ã³ããŒã®å Žåã E ã¯ã€ã³ã¹ã¿ã³ã¹åŒã§ãã
-
Mãéç颿°ã¡ã³ããŒã®å Žå:- åŒæ°ãªã¹ãã¯ã §12.6.2ã§èª¬æãããŠããããã«è©äŸ¡ãããŸãã
-
MãåŒã³åºãããŸãã
- ãã以å€ã®å Žåã
Eã®åãå€åã®Vã§ãããMãVã§å®£èšãŸãã¯ãªãŒããŒã©ã€ããããå Žå:-
Eãè©äŸ¡ãããŸãã ãã®è©äŸ¡ã«ãã£ãŠäŸå€ãçºçããå Žåããã以äžã®æé ã¯å®è¡ãããŸããã ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã®å Žåããã®è©äŸ¡ã¯ãæ°ãããªããžã§ã¯ãã«ã¹ãã¬ãŒãž (éåžžã¯å®è¡ã¹ã¿ãã¯ãã) ãå²ãåœãŠãããšã§æ§æãããŸãã ãã®å ŽåãEã¯å€æ°ãšããŠåé¡ãããŸãã -
Eã倿°ãšããŠåé¡ãããŠããªãå ŽåããŸãã¯Vãèªã¿åãå°çšæ§é äœå (§16.2.2) ã§ã¯ãªããMãèªã¿åãå°çšé¢æ°ã¡ã³ã㌠(§16.8.12) ã§ã¯ãªãå ŽåãEã¯æ¬¡ã®ããããã§ãã- å ¥åãã©ã¡ãŒã¿ãŒ (§15.6.2.3.2) ãŸãã¯
-
readonlyãã£ãŒã«ã (§15.5.3) ãŸã㯠-
readonlyåç §å€æ°ãŸãã¯æ»ãå€ (§9.7)ãEã®åã®äžæããŒã«ã«å€æ°ãäœæãããEã®å€ããã®å€æ°ã«å²ãåœãŠãããŸããEã¯ããã®äžæããŒã«ã«å€æ°ãžã®åç §ãšããŠååé¡ãããŸãã äžæå€æ°ã¯ãthiså ã§MãšããŠã¢ã¯ã»ã¹ã§ããŸãããä»ã®æ¹æ³ã§ã¯ã¢ã¯ã»ã¹ã§ããŸããã ãããã£ãŠãEãæžã蟌ã¿å¯èœãªå Žåã«éããåŒã³åºãå ã¯Mãthisã«å ãã倿Žã芳å¯ããããšãã§ããŸãã
- åŒæ°ãªã¹ãã¯ã §12.6.2ã§èª¬æãããŠããããã«è©äŸ¡ãããŸãã
-
MãåŒã³åºãããŸããEã«ãã£ãŠåç §ããã倿°ã¯ãthisã«ãã£ãŠåç §ããã倿°ã«ãªããŸãã
-
- ãã以å€ã®å Žå:
-
Eãè©äŸ¡ãããŸãã ãã®è©äŸ¡ã«ãã£ãŠäŸå€ãçºçããå Žåããã以äžã®æé ã¯å®è¡ãããŸããã - åŒæ°ãªã¹ãã¯ã §12.6.2ã§èª¬æãããŠããããã«è©äŸ¡ãããŸãã
-
Eã®åã value_typeã®å Žåããã¯ã·ã³ã°å€æïŒÂ§10.2.9ïŒãå®è¡ãããEã class_typeã«å€æãããæ¬¡ã®æé ã§Eã¯ãã® class_type ã§ãããšèŠãªãããŸãã value_type ã enum_typeã®å Žåã class_type ã¯System.Enum;ãã以å€ã®å Žåã¯System.ValueTypeã -
Eã®å€ãæå¹ã§ããããšã確èªãããŸããEã®å€ã null ã®å ŽåãSystem.NullReferenceExceptionãã¹ããŒããããã以äžã®æé ã¯å®è¡ãããŸããã - åŒã³åºã颿°ã¡ã³ããŒã®å®è£
ãæ±ºå®ãããŸãã
-
Eã®ãã€ã³ãæåãã€ã³ã¿ãŒãã§ã€ã¹ã®å ŽåãåŒã³åºã颿°ã¡ã³ããŒã¯ãMã«ãã£ãŠåç §ãããã€ã³ã¹ã¿ã³ã¹ã®ã©ã³ã¿ã€ã åã«ãã£ãŠæäŸãããEã®å®è£ ã§ãã ãã®é¢æ°ã¡ã³ããŒã¯ãã€ã³ã¿ãŒãã§ã€ã¹ ãããã³ã° èŠå (§19.6.5) ãé©çšããŠãMã«ãã£ãŠåç §ãããã€ã³ã¹ã¿ã³ã¹ã®ã©ã³ã¿ã€ã åã«ãã£ãŠæäŸãããEã®å®è£ ãæ±ºå®ããããšã«ãã£ãŠæ±ºå®ãããŸãã - ãã以å€ã®å Žåã
Mãä»®æ³é¢æ°ã¡ã³ããŒã®å ŽåãåŒã³åºã颿°ã¡ã³ããŒã¯ãMã«ãã£ãŠåç §ãããã€ã³ã¹ã¿ã³ã¹ã®ã©ã³ã¿ã€ã åã«ãã£ãŠæäŸãããEã®å®è£ ã§ãã ãã®é¢æ°ã¡ã³ããŒã¯ã ã«ãã£ãŠåç §ãããã€ã³ã¹ã¿ã³ã¹ã®å®è¡æåã«é¢ããŠãMã®æãæŽŸçããå®è£ ãæ±ºå®ããããã®èŠåïŒEïŒãé©çšããããšã«ãã£ãŠæ±ºå®ãããŸãã - ãã以å€ã®å Žåã
Mã¯éä»®æ³é¢æ°ã¡ã³ããŒã§ãããåŒã³åºã颿°ã¡ã³ããŒã¯Mããèªäœ ã
-
- äžèšã®æé ã§æ±ºå®ãã颿°ã¡ã³ããŒã®å®è£
ãåŒã³åºãããŸãã
Eã«ãã£ãŠåç §ããããªããžã§ã¯ããããã®ãªããžã§ã¯ãã«ãã£ãŠåç §ããããªããžã§ã¯ãã«ãªããŸãã
-
泚:§12.2 ã¯ã察å¿ãã颿°ã¡ã³ã㌠(
getã¢ã¯ã»ãµãŒãŸãã¯setã¢ã¯ã»ãµãŒ) ãåŒã³åºããã®ãšããŠãããã㣠ã¢ã¯ã»ã¹ãåé¡ããŸãã äžèšã®ããã»ã¹ã¯ããã®ã¢ã¯ã»ãµãŒãåŒã³åºãããã®æé ã«åŸããŸãã æ³šé
ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒ (§12.8.17.2) ã®åŒã³åºãã®çµæã¯ãäœæãããå€ã§ãã ãã®ä»ã®é¢æ°ã¡ã³ããŒã®åŒã³åºãã®çµæã¯ããã®é¢æ°æ¬äœããè¿ãããå€(ååšããå Žå)ïŒÂ§13.10.5ïŒã§ãã
12.6.6.2 ããã¯ã¹åãããã€ã³ã¹ã¿ã³ã¹ã§ã®åŒã³åºã
value_type ã«å®è£ ãããŠãã颿°ã¡ã³ããŒã¯ã次ã®ç¶æ³ã§ããã® value_type ã®ããã¯ã¹åãããã€ã³ã¹ã¿ã³ã¹ãä»ããŠåŒã³åºãããšãã§ããŸãã
- 颿°ã¡ã³ããŒãå class_type ããç¶æ¿ãããã¡ãœããã®ãªãŒããŒã©ã€ãã§ããããã® class_typeã®ã€ã³ã¹ã¿ã³ã¹åŒãä»ããŠåŒã³åºãããå Žåã
泚: class_type ã¯åžžã«
System.ObjectãSystem.ValueTypeãŸãã¯System.Enumã®ããããã«ãªããŸãã æ³šé - 颿°ã¡ã³ããŒãã€ã³ã¿ãŒãã§ã€ã¹é¢æ°ã¡ã³ããŒã®å®è£ ã§ããã interface_typeã®ã€ã³ã¹ã¿ã³ã¹åŒãä»ããŠåŒã³åºãããå Žåã
- ããªã²ãŒããä»ããŠé¢æ°ã¡ã³ããŒãåŒã³åºããããšãã
ãã®ãããªç¶æ³ã§ã¯ãããã¯ã¹åãããã€ã³ã¹ã¿ã³ã¹ã«ã¯ value_typeã®å€æ°ãå«ãŸããŠãããšèŠãªããããã®å€æ°ã¯é¢æ°ã¡ã³ããŒåŒã³åºãå ã§ãã®å€æ°ã«ãã£ãŠåç §ããã倿°ã«ãªããŸãã
泚: ç¹ã«ãããã¯ã¹åãããã€ã³ã¹ã¿ã³ã¹ã§é¢æ°ã¡ã³ããŒãåŒã³åºããããšã颿°ã¡ã³ããŒãããã¯ã¹åãããã€ã³ã¹ã¿ã³ã¹ã«å«ãŸããå€ã倿Žããå¯èœæ§ãããããšãæå³ããŸãã æ³šé
12.7 åè§£
åè§£ã¯ã³ã³ãã€ã«æã®å€æã§ãããåŒã¯åã ã®åŒã® ã¿ãã« ãªãã©ã« ã«çœ®ãæããããŸãã åè§£ã¯ãå²ãåœãŠã®åè§£ã§äœ¿çšãããŸã (§12.24.3)ã
E以å€ã®åSãæã€åŒdynamicã¯ã次ã®ãããããä¿æãããŠããå Žåã«ã¿ãã« ãªãã©ã«ã«åè§£ã§ããŸãã
Eãã¿ãã« ãªãã©ã«ã®å Žåãåè§£ã®çµæã¯ããèªäœEåŒã«ãªããŸãããã以å€ã®å Žåã
Eã«ã¿ãã«å(Tâ, âŠ, Tâ)ãããå Žåãåè§£ã®çµæã¯ã(E.Item1, âŠ, E.Itemn)ã 1 åã ãè©äŸ¡ããã以å€ã¯ãåŒEãšæå³çã«åçã«ãªããŸãããã以å€ã®å Žåã¯ãäžæã®ã€ã³ã¹ã¿ã³ã¹ãŸãã¯æ¡åŒµã¡ãœããã
S.Deconstruct;n ⥠2åºåãã©ã¡ãŒã¿ãŒããããåãTâã«TâãããŠããŠãä»ã®ãã©ã¡ãŒã¿ãŒããªãå Žåã¯ãEåè§£ã§ããŸãã åè§£ã®çµæã¯ãEãæ¬¡ã®æ¬äŒŒã³ãŒãã«çœ®ãæããããšãšæå³çã«åçã§ããE.Deconstruct(out T1 v1, âŠ, out TN vn) andThen (v1, âŠ, vn);ããã§ã
andThenã¯ãå·ŠåŽã®ãªãã©ã³ããå®è¡ããçµæãšããŠå³ãªãã©ã³ããè¿ãæ¬äŒŒ C# æŒç®ã§ããæ³š:
andThenã¯ãC ããã³ C++ ã®ã³ã³ãæŒç®åãšåãã§ãã æ³šé
äžèšã®ä¿ç E ãåè§£ã§ããªãå Žåã¯ãã³ã³ãã€ã«æãšã©ãŒã«ãªããŸãã
泚: ã¿ãã« ãªãã©ã« ã®åã ã®èŠçŽ ã®ã¿ã䜿çšãããã³ã³ããã¹ãã§åè§£ã䜿çšããå Žå (åè§£å²ãåœãŠã®äžéšãªã©)ãã¿ãã« ãªãã©ã« ããã®ã¿ãã«å€ã®äœæãæç€ºçã«èš±å¯ããŸãããã ããç£èŠå¯èœãªã»ãã³ãã£ã¯ã¹ã¯ Eliding ã¿ãã« (§8.3.11.2) ã§æå®ãããŠãããšããã«å€ãããŸããã æ³šé
12.8 äžæ¬¡åŒ
12.8.1 å šè¬
äž»ãªåŒã«ã¯ãæãåçŽãªåœ¢åŒã®åŒãå«ãŸããŸãã
primary_expression
: literal
| interpolated_string_expression
| simple_name
| parenthesized_expression
| tuple_literal
| member_access
| null_conditional_member_access
| invocation_expression
| element_access
| null_conditional_element_access
| this_access
| base_access
| post_increment_expression
| post_decrement_expression
| null_forgiving_expression
| array_creation_expression
| object_creation_expression
| delegate_creation_expression
| anonymous_object_creation_expression
| typeof_expression
| sizeof_expression
| checked_expression
| unchecked_expression
| default_value_expression
| nameof_expression
| anonymous_method_expression
| pointer_member_access // unsafe code support
| pointer_element_access // unsafe code support
| stackalloc_expression
| collection_expression
;
泚: ãã®ææ³èŠåã¯ãANTLR ãåŠçããªãçžäºå·Šååž°èŠå (
primary_expressionãmember_accessãinvocation_expressionãelement_accessãpost_increment_expressionãpost_decrement_expressionãnull_forgiving_expressionãpointer_member_accessãpointer_element_access) ã®ã»ããã®äžéšã§ãããããANTLR 察å¿ã§ã¯ãããŸããã æšæºã®ææ³ã䜿çšããŠææ³ã倿ããçžäºå·Šååž°ãåé€ã§ããŸãã ãã®æšæºã§ã¯ããã¹ãŠã®è§£ææŠç¥ã§å¿ èŠãšãããããã§ã¯ãªãããïŒäŸãã°ãLALRããŒãµãŒã§ã¯å¿ èŠãããŸããïŒããããè¡ããšæ§é ã説æãé£èªåãããããšã«ãªããŸãã æ³šé
pointer_member_access (§24.6.3) ãš pointer_element_access (§24.6.4) ã¯ãå®å šã§ãªãã³ãŒã (§24) ã§ã®ã¿äœ¿çšã§ããŸãã
12.8.2 ãªãã©ã«
literal (§6.4.5) ã§æ§æããã primary_expression ã¯ãå€ãšããŠåé¡ãããŸãã
12.8.3 ã€ã³ã¿ãŒãã¬ãŒãæåååŒ
interpolated_string_expression㯠1 ã€ä»¥äžã®$æåã§å§ãŸããå¿
èŠã«å¿ããŠ@ (è£éãããéèªæååã®å Žå) ãšçµã¿åãããããã®çŽåŸã«"ãŸãã¯"""ã¹ã¿ã€ã«ã®åºåãèšå·å
ã®ããã¹ããç¶ããŸãã åŒçšç¬Šã§å²ãŸããããã¹ãå
ã«ã¯ã1 ã€ä»¥äžã®{æåãš}æåã§åºåããã 0 å以äžã®è£éããããããããåŒãšçç¥å¯èœãªæžåŒæå®ãå²ã¿ãŸãã è£éã®äžéšã§ã¯ãªãåŒçšç¬Šã§å²ãŸããããã¹ã (次ã«ç€ºãææ³èŠå Interpolated_Regular_String_Midã Interpolated_Verbatim_String_Midã ããã³Interpolated_Raw_String_Mid ã«ãã£ãŠå®çŸ©ãããŠãã) ã¯ã è£éæåååŒã»ã°ã¡ã³ãã®äžéšã§ãã ãã®ãããåŒçšç¬Šã§å²ãŸããããã¹ãã«ã¯ã0 å以äžã®æ¿å
¥æåååŒã»ã°ã¡ã³ããå«ãŸããŸãã æ¬¡ã® interpolated_string_expressionã«ã€ããŠèããŠã¿ãŸãããã
$"val = {{{val,4:X}}}; 2 * val = {2 * val}."
ããã«ã¯ã "val = {"ã "}; 2 * val = "ãããã³ "."ã®æ¿å
¥æåååŒã»ã°ã¡ã³ããå«ãŸããŸãããã®ã»ã°ã¡ã³ãã®æåã®èŠçŽ ã¯ãæ¬¡ã®ææ³ã§èª¬æãããªãŒãã³/ã¯ããŒãº ãã¬ãŒã¹ ãšã¹ã±ãŒã ã·ãŒã±ã³ã¹ãååšããèŠçŽ ã§ãã åŒçšç¬Šã§å²ãŸããããã¹ãã«ã¯ãè£é "{val,4:X}" ãš "{2 * val}"ãå«ãŸããŸãã
interpolated_string_expressionã«ã¯ã次ã®ããããã®åœ¢åŒããããŸããregular (interpolated_regular_string_expression)ãverbatim (interpolated_verbatim_string_expression)ãraw (interpolated_raw_string_expression);æ§æçã«ã¯äŒŒãŠããŸãããæå³çã«ã¯ç°ãªããŸããã察å¿ãã圢åŒã®æååãªãã©ã« (§6.4.5.6)ã
interpolated_string_expression
: interpolated_regular_string_expression
| interpolated_verbatim_string_expression
| interpolated_raw_string_expression
;
// interpolated regular string expressions
interpolated_regular_string_expression
: Interpolated_Regular_String_Start Interpolated_Regular_String_Mid?
('{' regular_interpolation '}' Interpolated_Regular_String_Mid?)*
Interpolated_Regular_String_End
;
regular_interpolation
: expression (',' interpolation_minimum_width)?
Regular_Interpolation_Format?
;
interpolation_minimum_width
: constant_expression
;
Interpolated_Regular_String_Start
: '$"'
;
// the following three lexical rules are context sensitive, see details below
Interpolated_Regular_String_Mid
: Interpolated_Regular_String_Element+
;
Regular_Interpolation_Format
: ':' Interpolated_Regular_String_Element+
;
Interpolated_Regular_String_End
: '"'
;
fragment Interpolated_Regular_String_Element
: Interpolated_Regular_String_Character
| Simple_Escape_Sequence
| Hexadecimal_Escape_Sequence
| Unicode_Escape_Sequence
| Open_Brace_Escape_Sequence
| Close_Brace_Escape_Sequence
;
fragment Interpolated_Regular_String_Character
// Any character except " (U+0022), \\ (U+005C),
// { (U+007B), and } (U+007D).
: ~["\\{}]
;
// interpolated verbatim string expressions
interpolated_verbatim_string_expression
: Interpolated_Verbatim_String_Start Interpolated_Verbatim_String_Mid?
('{' verbatim_interpolation '}' Interpolated_Verbatim_String_Mid?)*
Interpolated_Verbatim_String_End
;
verbatim_interpolation
: expression (',' interpolation_minimum_width)?
Verbatim_Interpolation_Format?
;
Interpolated_Verbatim_String_Start
: '$@"'
| '@$"'
;
// the following three lexical rules are context sensitive, see details below
Interpolated_Verbatim_String_Mid
: Interpolated_Verbatim_String_Element+
;
Verbatim_Interpolation_Format
: ':' Interpolated_Verbatim_String_Element+
;
Interpolated_Verbatim_String_End
: '"'
;
fragment Interpolated_Verbatim_String_Element
: Interpolated_Verbatim_String_Character
| Quote_Escape_Sequence
| Open_Brace_Escape_Sequence
| Close_Brace_Escape_Sequence
;
fragment Interpolated_Verbatim_String_Character
: ~["{}] // Any character except " (U+0022), { (U+007B) and } (U+007D)
;
// lexical fragments used by both regular and verbatim interpolated strings
fragment Open_Brace_Escape_Sequence
: '{{'
;
fragment Close_Brace_Escape_Sequence
: '}}'
;
// interpolated raw string expressions
interpolated_raw_string_expression
: single_line_interpolated_raw_string_expression
| multi_line_interpolated_raw_string_expression
;
single_line_interpolated_raw_string_expression
: Interpolated_Raw_String_Start
(Interpolated_Raw_String_Mid | raw_interpolation)+
Interpolated_Raw_String_End
;
Interpolated_Raw_String_Prefix
: '$'+
;
Interpolated_Raw_String_Start
: Interpolated_Raw_String_Prefix Raw_String_Literal_Delimiter
;
// the following two lexical rules are context sensitive, see details below
Interpolated_Raw_String_Mid
: Raw_String_Literal_Content+
;
Interpolated_Raw_String_End
: Raw_String_Literal_Delimiter
;
raw_interpolation
: raw_interpolation_start expression
(',' interpolation_minimum_width)? Raw_Interpolation_Format?
raw_interpolation_end
;
raw_interpolation_start
: '{'+
;
raw_interpolation_end
: '}'+
;
// the following lexical rule is context sensitive, see details below
Raw_Interpolation_Format
: ':' Interpolated_Raw_String_Character+
;
fragment Interpolated_Raw_String_Character
// Any character except " (U+0022), \\ (U+005C),
// { (U+007B), } (U+007D), and New_Line_Character.
: ~["\\{}\u000D\u000A\u0085\u2028\u2029]
;
multi_line_interpolated_raw_string_expression
: Interpolated_Raw_String_Start Whitespace* New_Line
(Interpolated_Raw_String_Mid | raw_interpolation | New_Line)* New_Line
Whitespace* Interpolated_Raw_String_End
;
äžèšã§å®çŸ©ããåå¥èŠåã®å€ãã¯ã次ã®ããã« ã³ã³ããã¹ãã«äŸå ããŸãã
| èŠå | ã³ã³ããã¹ãèŠä»¶ |
|---|---|
| ã€ã³ã¿ãŒãã¬ãŒããã_ã¬ã®ã¥ã©ãŒ_ã¹ããªã³ã°_ããã | Interpolated_Regular_String_Startã®åŸã次ã®è£éã®éãããã³å¯Ÿå¿ãã Interpolated_Regular_String_Endã®åã«ã®ã¿èªèãããŸãã |
| Regular_Interpolation_Format | regular_interpolation å ã§ã®ã¿èªèãããéå§ã³ãã³ (:) ãäœããã®æ¬åŒ§ (äžžãã£ã/äžãã£ã/è§ãã£ã) ã§ãã¹ããããŠããªãå Žåã |
| Interpolated_Regular_String_End | Interpolated_Regular_String_Start ã®åŸã§ã®ã¿èªèãããä»å ¥ããããŒã¯ã³ããInterpolated_Regular_String_Mid ãŸãã¯ããã®ãããªè£éå ã®ä»»æã® interpolated_regular_string_expression ãå«ããregular_interpolation ã®äžéšã«ãªãããšãã§ããããŒã¯ã³ã§ããå Žåã |
| Interpolated_Verbatim_String_MidVerbatim_Interpolation_FormatInterpolated_Verbatim_String_End | ããã 3 ã€ã®èŠåã®èªèã¯ãäžèšã®å¯Ÿå¿ããæåã® 3 ã€ã®èŠåã®èªèã«åŸããåè¿°ã® åèŠå ã察å¿ãã éèª çèŠåã«çœ®ãæããããŸãã |
| Raw_Interpolation_FormatInterpolated_Raw_String_EndãInterpolated_Raw_String_Midãã | ããã 3 ã€ã®èŠåã®èªèã¯ãäžèšã®å¯Ÿå¿ããæåã® 3 ã€ã®èŠåã®èªèã«åŸããåè¿°ã® åèŠå ã察å¿ãã ç ã®èŠåã«çœ®ãæããããŸãã |
泚: äžèšã®èŠåã¯ãå®çŸ©ãèšèªå ã®ä»ã®ããŒã¯ã³ã®å®çŸ©ãšéè€ããå Žåãã³ã³ããã¹ãã«äŸåããŸãã æ³šé
泚æ: äžèšã®ææ³ã¯ãã³ã³ããã¹ãã«äŸåããåå¥ã«ãŒã«ã®ãããANTLR 察å¿ã§ã¯ãããŸããã ä»ã®åå¥ãžã§ãã¬ãŒã¿ãŒãšåæ§ã«ãANTLR ã¯ã³ã³ããã¹ãã«äŸåããåå¥èŠåããµããŒãããŸããããšãã°ã åå¥ã¢ãŒãã䜿çšããŸãããããã¯å®è£ ã®è©³çްã§ããããããã®ä»æ§ã®äžéšã§ã¯ãããŸããã æ³šé
interpolated_string_expressionã¯å€ãšããŠåé¡ããã衚瀺ãããã³ã³ããã¹ãã«å¿ããŠæ¬¡ã®ããããã®æ¹æ³ã§è©äŸ¡ãããŸãã
- 代å
¥ãŸãã¯ã¡ãœããåŒã³åºãåŒæ°ã®ã¿ãŒã²ããã«å
stringãããå ŽåãåŒã¯æ¢å®ã®è£éæååãã³ãã©ãŒ (System.Runtime.CompilerServices.DefaultInterpolatedStringHandler) ã«ãã£ãŠåŠçãããçµæã®åã¯stringã - 代å
¥ãŸãã¯ã¡ãœããåŒã³åºãã®åŒæ°ã®ã¿ãŒã²ããã«å
System.IFormattableãŸãã¯System.FormattableStringãããå Žåãæååå€ã¯æ¿å ¥æååããæ§æãããŸããã 代ããã«ãSystem.FormattableStringã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããŸãã - ä»£å ¥ãŸãã¯ã¡ãœããåŒã³åºãåŒæ°ã®ã¿ãŒã²ããã«ã«ã¹ã¿ã è£éæååãã³ãã©ãŒ (§23.5.11.1) åãããå Žåã¯ã
- è£éãããæååã«è£éãå«ãŸããŠããå ŽåãåŒã¯ã¿ãŒã²ããã®åã
stringããããã®ããã«åŠçãããŸãã - ãã以å€ã®å ŽåãåŒã¯ã«ã¹ã¿ã è£éæååãã³ãã©ãŒã«ãã£ãŠåŠçãããçµæã«ã¯ãã®ã«ã¹ã¿ã è£éæååãã³ãã©ãŒã®åãå«ãŸããŸãã
ãããã®èŠåãæ¬¡ã«ç€ºããŸãã
static void M(string s) { }
static void M(SomeInterpolatedStringHandler s) { }
int val = 255;
M($"no interpolations");// invokes M(string)
M($"{val}"); // invokes M(SomeInterpolatedStringHandler)
string s1 = $"{val}"; // default handler used, as target has type string
M(s1); // invokes M(string)
SomeInterpolatedStringHandler str2 = $"{val}"; // custom handler used
M(str2); // invokes M(SomeInterpolatedStringHandler)
ãã®ãµãã¯ã©ã¹ã®æ®ãã®éšåã§ã¯ãæ¢å®ã®è£éæååãã³ãã©ãŒã®åäœã®ã¿ãåŠçãããŸãã ã«ã¹ã¿ã è£éæååãã³ãã©ãŒã®å®£èšãšäœ¿çšã«ã€ããŠã¯ã §23.5.11.1 ãåç §ããŠãã ããã
è£é (regular_interpolationãverbatim_interpolationãraw_interpolation) ã®æå³ã¯ãRegular_Interpolation_FormatãVerbatim_Interpolation_FormatããŸãã¯Raw_Interpolation_Formatã§æå®ããã圢åŒã«åŸstringã®çš®é¡ã®æ¢å®ã®åœ¢åŒã«åŸã£ãŠãåŒã®å€ããšããŠæžåŒèšå®ããããšã§ãã æžåŒèšå®ãããæååã¯ãinterpolation_minimum_width(ååšããå Žå) ã«ãã£ãŠå€æŽããã該åœããå Žåã¯ãstring ã«è£éãããæçµç㪠ãçæãããŸãã
interpolation_minimum_width ã§ã¯ã constant_expression 㯠intãžã®æé»çãªå€æãæã€å¿
èŠããããŸãã
ãã£ãŒã«ãã®å¹
ã¯ããã® constant_expression ã®çµ¶å¯Ÿå€ãšããã®é
眮 ã¯ããã® constant_expressionã®å€ã«ãã笊å·ïŒæ£ãŸãã¯è² ïŒãšããŸãã
- ãã£ãŒã«ãå¹ ã®å€ãæžåŒèšå®ãããæååã®é·ã以äžã®å ŽåãæžåŒèšå®ãããæååã¯å€æŽãããŸããã
- ãã以å€ã®å ŽåãæžåŒèšå®ãããæååã®é·ãããã£ãŒã«ãã®å¹
ãšçãããªãããã«ãç©ºçœæåãåã蟌ãŸããŸãã
- é çœ®ãæ£ã®å ŽåãæžåŒèšå®ãããæååã«ããã£ã³ã°ã远å ããããšã§å³æãã«ãªããŸãã
- ãã以å€ã®å Žåã¯ãããã£ã³ã°ã远å ããããšã§å·Šæãã«ããŸãã
æ¿å ¥æåååŒã¯ãåè£éã®æžåŒæå®ãå«ãæžåŒæå®æååãªãã©ã«ãšããŠæ±ãããŸãã
æžåŒæå®æååãªãã©ã«ã¯æ¬¡ã®ããã«æ§ç¯ãããŸããããã§ãN 㯠interpolated_string_expressionå
ã®è£éæ°ã§ãã æžåŒæå®æååãªãã©ã«ã¯ã次ã®é åºã§æ§æãããŸãã
- Interpolated_Regular_String_StartãInterpolated_Verbatim_String_StartããŸãã¯Interpolated_Raw_String_Startã®æå
- Interpolated_Regular_String_MidãInterpolated_Verbatim_String_MidããŸãã¯Interpolated_Raw_String_Midã®æå (ååšããå Žå)
-
N ⥠1ããIãžã®0åã¡ã³ããŒã®N-1ã®å Žå:- ãã¬ãŒã¹ãã«ããŒã®ä»æ§:
- å·Šäžãã£ã (
{) æå -
Iã® 10 é²è¡šçŸ - 次ã«ã察å¿ããregular_interpolationãverbatim_interpolationããŸãã¯raw_interpolationã«interpolation_minimum_widthãããå Žåã¯ãã³ã³ã (
,) ã®åŸã«constant_expressionã®å€ã® 10 é²è¡šçŸãç¶ããŸãã - 察å¿ããregular_interpolationãverbatim_interpolationããŸãã¯raw_interpolationã®Regular_Interpolation_FormatãVerbatim_Interpolation_FormatããŸãã¯Raw_Interpolation_Formatã®æå (ååšããå Žå)
- å³äžãã£ã (
}) æå
- å·Šäžãã£ã (
- 察å¿ããè£éã®çŽåŸã® Interpolated_Regular_String_Midã Interpolated_Verbatim_String_MidããŸã㯠Interpolated_Raw_String_Mid ã®æå (ååšããå Žå)
- ãã¬ãŒã¹ãã«ããŒã®ä»æ§:
- æåŸã«ã Interpolated_Regular_String_Endã Interpolated_Verbatim_String_EndããŸã㯠Interpolated_Raw_String_Endã®æåã
åŸç¶ã®åŒæ°ã¯ãè£éããé çªã«åŒã§ã (ååšããå Žå)ã
interpolated_string_expression ã«è€æ°ã®è£éãå«ãŸããŠããå Žåããããã®è£éã®åŒã¯å·Šããå³ã®ããã¹ãé ã§è©äŸ¡ãããŸãã
äŸ:
ãã®äŸã§ã¯ãæ¬¡ã®æžåŒæå®æ©èœã䜿çšããŸãã
- æŽæ°ã倧æåã® 16 鲿°ãšããŠæžåŒèšå®ãã
XæžåŒæå®ã -
stringå€ã®æ¢å®ã®åœ¢åŒã¯å€èªäœã§ãã - æå®ãããæå°ãã£ãŒã«ãå¹ å ã§å³æãããããžãã£ã ã¢ã©ã€ã¡ã³ãå€ã
- æå®ãããæå°ãã£ãŒã«ãå¹ å ã§å·Šæããããã¬ãã£ã ã¢ã©ã€ã¡ã³ãå€ã
- interpolation_minimum_width ã«å¯ŸããŠå®çŸ©ããã宿°ãããã³
-
{{ãš}}ã¯ããããã{ããã³}ãšããŠæžåŒèšå®ãããŸãã
ããšãã°ã以äžã®ããã«æå®ãããšããŸãã
string text = "red";
int number = 14;
const int width = -4;
ãã®åŸã以äžãå®è¡ããŸãã
| è£éãããæåååŒ |
stringãšå矩 |
å€ |
|---|---|---|
$"{text}" |
string.Format("{0}", text) |
"red" |
$"{{text}}" |
string.Format("{{text}}) |
"{text}" |
$"{ text , 4 }" |
string.Format("{0,4}", text) |
" red" |
$"{ text , width }" |
string.Format("{0,-4}", text) |
"red " |
$"{number:X}" |
string.Format("{0:X}", number) |
"E" |
$"{text + '?'} {number % 3}" |
string.Format("{0} {1}", text + '?', number % 3) |
"red? 2" |
$"{text + $"[{number}]"}" |
string.Format("{0}", text + string.Format("[{0}]", number)) |
"red[14]" |
$"{(number==0?"Zero":"Non-zero")}" |
string.Format("{0}", (number==0?"Zero":"Non-zero")) |
"Non-zero" |
$$""""{number}"""" |
string.Format("{{number}}") |
"{number}" |
$$"""{{number}}""" |
string.Format("{0}", number) |
"14" |
$$"""""{{{number}}}""""" |
string.Format("{{{0}}}", number) |
"{14}" |
çµäºãµã³ãã«
宿°è£éæååã¯ã次ãå«ãinterpolated_string_expressionã§ãã
- è£éãªãããŸãã¯
-
åŒs ã
stringåã®å®æ°åŒã§ããããããã®è£éã«ã¯interpolation_minimum_widthãRegular_Interpolation_FormatãVerbatim_Interpolation_FormatããŸãã¯Raw_Interpolation_Formatæå®åããããŸããã
ããšãã°ã$"Hello"ã$"{cs1}ãworld!" (æå® const string cs1 = $"Hello";)ã$"{"Hello"ã" + $"world!"}"ãããã³ $"xxx{(true ? $"{"X"}" : $"{$"{"Y"}"}")}yyy" ã¯ãã¹ãŠå®æ°è£éæååã§ãã ãã ãã$"{123}" ãš $"{"abc"}{123.45}" ã¯ãããŸããã
ããããããããããã«ãISE ãšããçšèªã¯ãinterpolated_string_expressionæŒç®åãšãã€ã㪠æŒç®åã§æ§æãããinterpolated_string_expressionãŸãã¯+ãæå³ããããã«ããã®ä»æ§å
šäœã§äœ¿çšãããŸãã
12.8.4 åçŽãªåå
simple_name ã¯èå¥åã§æ§æãããå¿ èŠã«å¿ããŠååŒæ°ãªã¹ããç¶ããŸãã
simple_name
: identifier type_argument_list?
;
simple_name ã¯ããã©ãŒã I ãŸãã¯ãã©ãŒã I<Aâ, ..., Aâ>ã®ããããã®ãã®ã§ããããã§ã I 㯠1 ã€ã®èå¥åã§ããã I<Aâ, ..., Aâ> ã¯çç¥å¯èœãª type_argument_listã§ãã
type_argument_list ãæå®ãããŠããªãå Žåã¯ã e ã 0 ã«ããããšãæ€èšããŠãã ããã
simple_name ã¯æ¬¡ã®ããã«è©äŸ¡ãåé¡ãããŸãã
-
eã 0 ã§ãããŒã«ã«å€æ°å®£èšç©ºé (§7.2) å ã«ãããŒã«ã«å€æ°ããã©ã¡ãŒã¿ãŒ (ç Žæ£ãã©ã¡ãŒã¿ãŒ (§12.22.2) ãé€ã)ããŸãã¯ååIã®å®æ°ãçŽæ¥å«ãsimple_nameã衚瀺ãããå Žåãsimple_nameã¯ãã®ããŒã«ã«å€æ°ããã©ã¡ãŒã¿ãŒããŸãã¯å®æ°ãåç §ãã倿°ãŸãã¯å€ãšããŠåé¡ãããŸãã -
eã 0 ã§ã simple_name ããžã§ããªã㯠ã¡ãœãã宣èšå ã«åºçŸãããããã® method_declaration ã® å±æ§ å€ã«ããå Žåããã®å®£èšã«ååIãæã€åãã©ã¡ãŒã¿ãŒãå«ãŸããŠããå Žåã simple_name ã¯ãã®åãã©ã¡ãŒã¿ãŒãåç §ããŸãã -
eã 0 ã§ãã¡ãœãã宣èšãŸãã¯ãã®ãã©ã¡ãŒã¿ãŒã®å±æ§ã®nameofåŒå ã«simple_nameã衚瀺ããããã®å®£èšã«ååIãæã€ãã©ã¡ãŒã¿ãŒãŸãã¯åãã©ã¡ãŒã¿ãŒãå«ãŸããŠããå Žåãsimple_nameã¯ãã®ãã©ã¡ãŒã¿ãŒãŸãã¯åãã©ã¡ãŒã¿ãŒãåç §ããŸãã - ãã以å€ã®å Žåã¯ãåã€ã³ã¹ã¿ã³ã¹å
T(§15.3.2) ã«å¯ŸããŠãããã«å€åŽã®å宣èšã®ã€ã³ã¹ã¿ã³ã¹åããå§ãŸããå€åŽã®åã¯ã©ã¹ãŸãã¯æ§é äœå®£èšã®ã€ã³ã¹ã¿ã³ã¹å (ååšããå Žå) ãç¶è¡ããŸãã-
Tã®å®£èšã«ãã©ã€ã㪠ã³ã³ã¹ãã©ã¯ã¿ãŒ ãã©ã¡ãŒã¿ãŒIãå«ãŸããŠãããåç §ãTã®class_baseã®argument_listå ããŸãã¯Tã®ãã£ãŒã«ããããããã£ããŸãã¯ã€ãã³ãã®åæååå ã§è¡ãããå Žåãçµæã¯ãã©ã€ã㪠ã³ã³ã¹ãã©ã¯ã¿ãŒ ãã©ã¡ãŒã¿ãŒIã«ãªããŸãã - ãã以å€ã®å Žåã
eã 0 ã§ãTã®å®£èšã«ååIãæã€åãã©ã¡ãŒã¿ãŒãå«ãŸããŠããå Žåã simple_name ã¯ãã®åãã©ã¡ãŒã¿ãŒãåç §ããŸãã - ãã以å€ã®å Žåã å
ã§
IååŒæ°ãçšããTã®ã¡ã³ããŒåç § (e) ãäžèŽãçããå Žå:-
Tããããã«å²ãã¯ã©ã¹ãŸãã¯æ§é äœåã®ã€ã³ã¹ã¿ã³ã¹åã§ãããæ€çŽ¢ã§ 1 ã€ä»¥äžã®ã¡ãœãããèå¥ãããå Žåãçµæã¯ãthisã®ã€ã³ã¹ã¿ã³ã¹åŒãé¢é£ä»ããããã¡ãœãã ã°ã«ãŒãã«ãªããŸãã ååŒæ°ãªã¹ããæå®ãããŠããå Žåã¯ããžã§ããªã㯠ã¡ãœãã (§12.8.10.2) ã®åŒã³åºãã§äœ¿çšãããŸãã - ãã以å€ã®å Žåã
TãçŽæ¥å²ãã¯ã©ã¹ãŸãã¯æ§é äœã®ã€ã³ã¹ã¿ã³ã¹ã®åã§ãããæ€çŽ¢ãã€ã³ã¹ã¿ã³ã¹ ã¡ã³ããŒãèå¥ããåç §ãã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒãã€ã³ã¹ã¿ã³ã¹ ã¡ãœããããŸãã¯ã€ã³ã¹ã¿ã³ã¹ ã¢ã¯ã»ãµãŒã® ããã㯠å ã§çºçããå Žå (§12.2.1)ãçµæã¯åœ¢åŒ ã®ã¡ã³ã㌠ã¢ã¯ã»ã¹ (this.I) ãšåãã«ãªããŸãã ããã¯ãeã 0 ã®å Žåã«ã®ã¿çºçããŸãã - ãã以å€ã®å Žåãçµæã¯ãã©ãŒã ãŸãã¯
T.Iã®ã¡ã³ã㌠ã¢ã¯ã»ã¹ (T.I<Aâ, ..., Aâ>) ãšåãã§ãã
-
- ãã以å€ã®å Žåã
Tã®å®£èšã«ãã©ã€ã㪠ã³ã³ã¹ãã©ã¯ã¿ãŒ ãã©ã¡ãŒã¿ãŒIãå«ãŸããŠããå Žåãçµæã¯ãã©ã€ã㪠ã³ã³ã¹ãã©ã¯ã¿ãŒ ãã©ã¡ãŒã¿ãŒIã«ãªããŸãã
-
- ãã以å€ã®å Žåã¯ã
Nããšã®åå空éã«å¯ŸããŠãsimple_name ãååšããåå空éããå§ãŸããå€åŽã®ååå空é (ååšããå Žå) ãç¶è¡ããã°ããŒãã«åå空éã§çµãããŸã§ããšã³ãã£ãã£ãèŠã€ãããŸã§ã次ã®ã¹ããããè©äŸ¡ãããŸãã-
Nãã°ããŒãã«åå空éã®å ŽåãçŸåšã®compilation_unitã«ã¯æäžäœã¬ãã«ã®ã¹ããŒãã¡ã³ã (§7.1.3) ãå«ãŸããŠãããsimple_nameã®å®£èšã¯ãçæããããšã³ã㪠ãã€ã³ã ã¡ãœãã (§7.1.3) ã®method_body (§15.6.1) å ã§çŽæ¥çºçããŸãã- ã¢ã¯ã»ã¹ãç¡å¹ã§ãããã³ã³ãã€ã©æãšã©ãŒãçæãããŸãã
泚: ãã®èŠåã¯ãæäžäœã¬ãã«ã®ã¹ããŒãã¡ã³ãå ã®äžéšã® simple_name ã®å®£èšããåã simple_nameã䜿çšããŠåç §ãããŠããå Žåãã°ããŒãã«å®£èšãé衚瀺ã«ã§ããããšãæå³ããŸãã æ³šé
- ã¢ã¯ã»ã¹ãç¡å¹ã§ãããã³ã³ãã€ã©æãšã©ãŒãçæãããŸãã
- ãã以å€ã®å Žåã
eã 0 ã§ãIãNå ã®åå空éã®ååã§ããå Žåã¯ã次ã®ããã«ãªããŸãã-
simple_nameãçºçããå Žæã
Nã®åå空é宣èšã§å²ãŸããŠãããåå空é宣èšã«åå空éãŸãã¯åã«ååãé¢é£ä»ããextern_alias_directiveãŸãã¯Iãå«ãŸããŠããå ŽåããŸãã¯ããã°ã©ã å ã®Nã®åå空é宣èšã«ãååãåå空éãŸãã¯åã«é¢é£ä»ããIãå«ãŸããŠããå Žåã¯ã ãã®åŸãsimple_nameããããŸãã«ãªããã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã - ãã以å€ã®å Žåã simple_name ã¯
Iã®Nãšããååã®åå空éãåç §ããŸãã
-
simple_nameãçºçããå Žæã
- ãã以å€ã®å Žåã
Nã«ååIããã³eåãã©ã¡ãŒã¿ãŒãæã€ã¢ã¯ã»ã¹å¯èœãªåãå«ãŸããŠããå Žåã¯ã次ã®ããã«ãªããŸãã-
eããŒãã§ãsimple_nameãçºçããå ŽæãNã®åå空é宣èšã§å²ãŸããŠãããåå空é宣èšã«åå空éãŸãã¯åã«ååãé¢é£ä»ããextern_alias_directiveãŸãã¯Iãå«ãŸããŠããå ŽåããŸãã¯ããã°ã©ã å ã®Nã®åå空é宣èšã«åå空éãŸãã¯åã«ååãé¢é£ä»ããIãå«ãŸããŠããå Žå ãã®åŸãsimple_nameããããŸãã«ãªããã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã - ãã以å€ã®å Žåã namespace_or_type_name ã¯ãæå®ãããååŒæ°ã§æ§ç¯ãããåãåç §ããŸãã
-
- ãã以å€ã®å Žåãsimple_name ãçºçããå Žæã
Nã®åå空é宣èšã§å²ãŸããŠããå Žå:-
eã 0 ã§ãååãã€ã³ããŒããããåå空éãŸãã¯åã«é¢é£ä»ããextern_alias_directiveãŸãã¯Iãåå空é宣èšã«å«ãŸããŠããå ŽåããŸãã¯ããã°ã©ã å ã®Nã®åå空é宣èšã«ãã€ã³ããŒããããåå空éãŸãã¯åã«ååãé¢é£ä»ããglobal_using_alias_directiveãå«ãŸããŠããIå Žåãsimple_nameã¯ãã®åå空éãŸãã¯åãåç §ããŸãã - ãã以å€ã®å Žåãåå空é宣èšã®using_namespace_directiveã«ãã£ãŠã€ã³ããŒããããåå空éãããã³ããã°ã©ã å
ã®ã®åå空é宣èšã®global_using_namespace_directiveããã³global_using_static_directives ã«ãã£ãŠã€ã³ããŒããããåå空éãšå宣èšã«ãåå
NIãšeåãã©ã¡ãŒã¿ãŒãæã€åã 1 ã€ã ãå«ãŸããŠããå Žåãsimple_nameã¯ãæå®ãããååŒæ°ã§æ§ç¯ãããåãåç §ããŸãã - ãã以å€ã®å Žåãåå空é宣èšã®using_namespace_directiveã«ãã£ãŠã€ã³ããŒããããåå空éãããã³ããã°ã©ã å
ã®ã®åå空é宣èšã®global_using_namespace_directiveããã³global_using_static_directiveã«ãã£ãŠã€ã³ããŒããããåå空éãšå宣èšã«ãåå
Nããã³Ieåãã©ã¡ãŒã¿ãŒãæã€è€æ°ã®åãå«ãŸããŠããå Žåãsimple_nameã¯ãããŸãã«ãªããã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
-
泚: ãã®ã¹ãããå šäœã¯ã namespace_or_type_name (§7.7) ã®åŠçã«ããã察å¿ããã¹ããããšå®å šã«å¹³è¡ã§ãã æ³šé
-
- ãã以å€ã®å Žåã
eã 0 ã§ãIã_èå¥åã§ããå Žåã simple_name 㯠åçŽãªç Žæ£ã§ããã宣èšåŒ (§12.20) ã®åœ¢åŒã§ãã - ãã以å€ã®å Žåã simple_name ã¯æªå®çŸ©ã§ãããã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
12.8.5 æ¬åŒ§ã§å²ãŸããåŒ
æ¬åŒ§ã§å²ãŸããåŒã¯ãæ¬åŒ§ã§å²ãããåŒã§æ§æãããŸãã
parenthesized_expression
: '(' expression ')'
;
parenthesized_expression ã¯ãæ¬åŒ§å ã®åŒãè©äŸ¡ããããšã§è©äŸ¡ãããŸãã ãã£ãå ã® åŒ ãåå空éãŸãã¯åã瀺ããŠããå Žåã¯ãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã ãã以å€ã®å Žåãparenthesized_expression ã®çµæããå«ãŸããåŒã®è©äŸ¡ã®çµæãšãªããŸãã
12.8.6 ã¿ãã« ãªãã©ã«
tuple_literalã¯ã¿ãã«ã衚ãããã£ãã§å²ãŸãã 2 ã€ä»¥äžã®ã³ã³ãåºåãåŒãšå¿ èŠã«å¿ããŠååä»ãåŒã§æ§æãããŸãã
tuple_literal
: '(' tuple_element (',' tuple_element)+ ')'
;
tuple_element
: (identifier ':')? expression
;
tuple_literalã¯ã¿ãã« (§12.2.1) ãšããŠåé¡ãããŸãã
ã¿ãã« ãªãã©ã«ã¯ãåèŠçŽ åŒãåEáµ¢Táµ¢å Žåã«ã®ã¿åãæã¡ãŸãã ãã®åã¯ã¿ãã« ãªãã©ã«ãšåãã¢ãªãã£ã®ã¿ãã«åã§ãããåèŠçŽ ã¯æ¬¡ã®ããã«æå®ãããŸãã
- 察å¿ããäœçœ®ã®ã¿ãã«èŠçŽ ã«èŠçŽ å
Iáµ¢ãããå Žåãã¿ãã«åèŠçŽ ã¯Táµ¢ Iáµ¢ã - ãã以å€ã®å Žåã
Eáµ¢ãIᵢ圢åŒãŸãã¯E.Iᵢ圢åŒãŸãã¯E?.Iáµ¢ã®å Žå(Iáµ¢ãèå¥åã§ããå Žå)ãã¿ãã«åèŠçŽ ã¯ã次ã®ãããããä¿æTáµ¢ Iáµ¢ã- ã¿ãã« ãªãã©ã«ã®å¥ã®èŠçŽ ã«èŠçŽ å
Iáµ¢ããããŸãã - èŠçŽ åã®ãªãå¥ã®ã¿ãã«èŠçŽ ã«ã¯ã
Iáµ¢ãŸãã¯E.Iáµ¢ãŸãã¯E?.Iᵢ圢åŒã®ã¿ãã«èŠçŽ åŒããããŸãã -
Iáµ¢ã¯ãã©ãŒãItemXã§ããããã§ãXã¯ã¿ãã«èŠçŽ ã®äœçœ®ã衚ãå¯èœæ§ã®ããå é ã«ãŒããä»ããã« 10 鲿°åã®ã·ãŒã±ã³ã¹ã§ãããXã¯èŠçŽ ã®äœçœ®ã衚ããŸããã
- ã¿ãã« ãªãã©ã«ã®å¥ã®èŠçŽ ã«èŠçŽ å
- ãã以å€ã®å Žåãã¿ãã«åèŠçŽ ã¯
Táµ¢ã§ãã
ã¿ãã«å€ã¯ã次ã®å Žåã«ã¿ãã« ãªãã©ã«ããååŸã§ããŸãã
- ããã¯å€æã®å¯Ÿè±¡ (§10.2.13) ã§ãããå€æã¯æ¬è³ªçã«æã€å¯èœæ§ã®ããä»»æã®åã眮ãæããŸãã
- ããã¯åè§£å²ãåœãŠã®ã¿ãŒã²ããã§ã (§12.24.3)ããŸãã¯
- å€ (§12.2.2)) ãšããŠååé¡ãããŸãã
äŸ:
(short, long) x = (1, 2L); // literal has a type replaced by implicit conversion var y = (1, 2L); // y has type (int, long)ããã 2 ã€ã®äŸã¯ãäžèšã®æåã®ã±ãŒã¹ã§ã®ä¿®é£Ÿã®ç®çã瀺ããŠããŸããããã«ãããæé»çãªå®æ°å€æãå¯èœã«ãªããŸã (§10.2.11)ã ã¿ãã« ãªãã©ã«ã®åã¯
(int, long)ãintããshortãžã®æé»çãªå€æã¯ãããŸãããã宿°1ãã short ãžã®å€æããããŸãã æåã®äŸã§ã¯ãã¿ãã« ãªãã©ã«ã®åºæã®åã眮ãæããæé»çãªå€æãå«ãŸããŸãã æé»çãªå€æã䌎ããªã 2 çªç®ã®äŸã§ã¯ãã¿ãã« ãªãã©ã«ã¯åºæã®åã«åºã¥ããŠå€ãšããŠååé¡ãããŸãã(long l, string) t1 = (l: 1, null); // literal has no type, use implicit conversion var t2 = (i: 2, "Two"); // (int i, string) var t3 = (i: 3, null); // Error: no type3 ã€ã®å®£èšã¹ããŒãã¡ã³ãã®ãã®äŸã§ã¯ãåæåã¿ãã« ãªãã©ã«èªäœã¯ãã¹ãŠæå¹ã§ãã
t1ã®å Žåãæé»çãªã¿ãã«å€æã¯ã1ããlongãžã®æé»çãªå€æãšãnullããstringãžã®æé»çãªå€æã«äŸåããŸãã 2 çªç®ã®ã¿ãã« ãªãã©ã«ã«ã¯(int i, string)åãããããããã®åã®å€ãšããŠååé¡ã§ããŸãã äžæ¹ãt3ã®å®£èšã¯ãšã©ãŒã§ããã¿ãã« ãªãã©ã«ã«ã¯åããªãããã2 çªç®ã®èŠçŽ ã«ã¯åããªããå€ãšããŠååé¡ã§ããªãããã倱æããŸããif ((x, y).Equals((1, 2))) { ... };ãã®äŸã¯ãã¿ãã«ãªãã©ã«ãã¡ãœããåŒã³åºãã®å¯äžã®åŒæ°ã§ããå Žåã«ãã¿ãã«ãè€æ°ã®ãã£ãã®å±€ã«ã€ãªããå¯èœæ§ãããããšã瀺ããŠããŸãã
çµäºãµã³ãã«
12.8.7 ã¡ã³ã㌠ã¢ã¯ã»ã¹
12.8.7.1 å šè¬
member_access ã¯ãprimary_expressionãpredefined_type ãŸã㯠qualified_alias_member ã§æ§æãããã.ãããŒã¯ã³ãèå¥åãç¶ããä»»æã§ãtype_argument_list ãç¶ããŸãã
member_access
: primary_expression '.' identifier type_argument_list?
| predefined_type '.' identifier type_argument_list?
| qualified_alias_member '.' identifier type_argument_list?
;
predefined_type
: 'bool' | 'byte' | 'char' | 'decimal' | 'double' | 'float' | 'int'
| 'long' | 'object' | 'sbyte' | 'short' | 'string' | 'uint' | 'ulong'
| 'ushort'
;
qualified_alias_memberçç£ã¯ §14.9 ã§å®çŸ©ãããŠããŸãã
member_access ã¯ãE.I ããããŸã㯠E.I<Aâ, ..., Aâ> ããã®ããããã§ãE ã¯ãprimary_expressionãpredefined_type ãŸã㯠qualified_alias_member ã§ãI ã¯ãåäžèå¥åã§ã<Aâ, ..., Aâ> ã¯ä»»æã® type_argument_list ã§ãã
type_argument_list ãæå®ãããŠããªãå Žåã¯ã e ã 0 ã«ããããšãæ€èšããŠãã ããã
å ããã primary_expression ã® dynamic ã¯ãåçã«ãã€ã³ããããŸã (§12.3.3)ã ãã®å Žåãã¡ã³ã㌠ã¢ã¯ã»ã¹ã¯å dynamicã®ãããã㣠ã¢ã¯ã»ã¹ãšããŠåé¡ãããŸãã
member_access ã®æå³ã倿ããããã®ä»¥äžã®èŠåã¯ã primary_expressionã®ã³ã³ãã€ã«æã®åã§ã¯ãªãå®è¡æã®åã䜿çšããŠå®è¡æã«é©çšãããŸãã ãã®ã©ã³ã¿ã€ã åé¡ããã¡ãœããã°ã«ãŒãã«ã€ãªããå Žåãã¡ã³ã㌠ã¢ã¯ã»ã¹ã¯ãinvocation_expression ã® primary_expression ã«ãªããŸãã
member_access ã¯æ¬¡ã®ããã«è©äŸ¡ãããåé¡ãããŸãã
-
eã 0 ã§ãEãåå空éã§ãããEã«ååIãæã€å ¥ãåã«ãªã£ãåå空éãå«ãŸããŠããå Žåãçµæã¯ãã®åå空éã«ãªããŸãã - ãã以å€ã®å Žåã
Eãåå空éã§ãããEã«ååIããã³Kåãã©ã¡ãŒã¿ãŒãæã€ã¢ã¯ã»ã¹å¯èœãªåãå«ãŸããŠããå Žåããã®åã¯æå®ãããååŒæ°ã§æ§ç¯ãããŸãã -
EãåãšããŠåé¡ãããEãåãã©ã¡ãŒã¿ã§ãªãã ã®IãšEåãã©ã¡ãŒã¿ã®ã¡ã³ãæ€çŽ¢ (K) ã§äžèŽãçæãããå ŽåãE.Iã¯æ¬¡ã®ããã«è©äŸ¡ãåé¡ãããŸããæ³š: ãã®ãããªã¡ã³ããŒæ€çŽ¢ã®çµæãã¡ãœãã ã°ã«ãŒãã§ã
Kã 0 ã®å Žåãã¡ãœãã ã°ã«ãŒãã«ã¯åãã©ã¡ãŒã¿ãŒãæã€ã¡ãœãããå«ããããšãã§ããŸãã ããã«ããããã®ãããªã¡ãœãããååŒæ°ã®æšè«ãšèŠãªãããšãã§ããŸãã æ³šé-
Iãåãèå¥ããå Žåãçµæã¯ãæå®ãããååŒæ°ã䜿çšããŠæ§ç¯ãããåã«ãªããŸãã -
Iã 1 ã€ä»¥äžã®ã¡ãœãããèå¥ããå Žåãçµæã¯ã€ã³ã¹ã¿ã³ã¹åŒãé¢é£ä»ããããŠããªãã¡ãœãã ã°ã«ãŒãã«ãªããŸãã -
Iãéçããããã£ãèå¥ããå Žåãçµæã¯ãé¢é£ä»ããããã€ã³ã¹ã¿ã³ã¹åŒã®ãªããããã㣠ã¢ã¯ã»ã¹ã«ãªããŸãã -
Iãéçãã£ãŒã«ããèå¥ããå Žå:- ãã£ãŒã«ããèªã¿åãå°çšã§ããã£ãŒã«ãã宣èšãããŠããã¯ã©ã¹ãŸãã¯æ§é äœã®éçã³ã³ã¹ãã©ã¯ã¿ãŒã®å€éšã§åç
§ãçºçããå Žåãçµæã¯å€(ã€ãŸãã
Iã«ãããéçãã£ãŒã«ãEã®å€) ã«ãªããŸãã - ãã以å€ã®å Žåãçµæã¯å€æ°ãã€ãŸã
Iã«ãããéçãã£ãŒã«ãEã§ãã
- ãã£ãŒã«ããèªã¿åãå°çšã§ããã£ãŒã«ãã宣èšãããŠããã¯ã©ã¹ãŸãã¯æ§é äœã®éçã³ã³ã¹ãã©ã¯ã¿ãŒã®å€éšã§åç
§ãçºçããå Žåãçµæã¯å€(ã€ãŸãã
-
Iãéçã€ãã³ããèå¥ããå Žå:- ã€ãã³ãã宣èšãããŠããã¯ã©ã¹ãŸãã¯æ§é äœå
ã§åç
§ãçºçããã€ãã³ãã event_accessor_declarations (§15.8.1) ãªãã§å®£èšãããå Žåã
E.Iã¯ãIãéçãã£ãŒã«ãã§ãããã®ããã«æ£ç¢ºã«åŠçãããŸãã - ãã以å€ã®å Žåãçµæã¯ã€ã³ã¹ã¿ã³ã¹åŒãé¢é£ä»ããããŠããªãã€ãã³ã ã¢ã¯ã»ã¹ã§ããããšã«ãªããŸãã
- ã€ãã³ãã宣èšãããŠããã¯ã©ã¹ãŸãã¯æ§é äœå
ã§åç
§ãçºçããã€ãã³ãã event_accessor_declarations (§15.8.1) ãªãã§å®£èšãããå Žåã
-
Iã宿°ãèå¥ããå Žåãçµæã¯å€ãã€ãŸããã®å®æ°ã®å€ã«ãªããŸãã -
Iãåæã¡ã³ããŒãèå¥ããå Žåãçµæã¯å€ (ã€ãŸãããã®åæã¡ã³ããŒã®å€) ã«ãªããŸãã - ãã以å€ã®å Žåã
E.Iã¯ç¡å¹ãªã¡ã³ããŒæ€çŽ¢ã§ãããã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
-
-
Eããããã㣠ã¢ã¯ã»ã¹ãã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã倿°ããŸãã¯å€ã§ããããã®åãTã§ããã å ã®IãšTååŒæ°ã®ã¡ã³ããŒæ€çŽ¢ (K) ã§äžèŽãçæãããå ŽåãE.Iã¯æ¬¡ã®ããã«è©äŸ¡ãããåé¡ãããŸãã- æåã«ã
Eãããããã£ãŸãã¯ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã®å Žåãããããã£ãŸãã¯ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã®å€ (§12.2.2) ãååŸãããE ãå€ãšããŠååé¡ãããŸãã -
Iã 1 ã€ä»¥äžã®ã¡ãœãããèå¥ããå Žåãçµæã¯ãé¢é£ä»ããããã€ã³ã¹ã¿ã³ã¹åŒEãæã€ã¡ãœãã ã°ã«ãŒãã«ãªããŸãã -
Iãã€ã³ã¹ã¿ã³ã¹ ããããã£ãèå¥ããå Žåãçµæã¯ãEã®é¢é£ä»ããããã€ã³ã¹ã¿ã³ã¹åŒãšãããããã£ã®åã§ããé¢é£ä»ããããåãæã€ãããã㣠ã¢ã¯ã»ã¹ã«ãªããŸããTãã¯ã©ã¹åã®å Žåãé¢é£ä»ããããŠããåã¯ãTã§å§ãŸãããã®åºåºã¯ã©ã¹ãæ€çŽ¢ãããšãã«èŠã€ãã£ãããããã£ã®æåã®å®£èšãŸãã¯ãªãŒããŒã©ã€ãããéžæãããŸããTãã€ã³ã¿ãŒãã§ã€ã¹åã®å Žåãé¢é£ä»ããããåã¯ãTããã³ãã®çŽæ¥ãŸãã¯éæ¥çãªåºæ¬ã€ã³ã¿ãŒãã§ã€ã¹ã®äžãããæãå ·äœç㪠(§19.4.10) ã€ã³ã¿ãŒãã§ã€ã¹ã§èŠã€ãã£ãããããã£ã®å®£èšãŸãã¯ãªãŒããŒã©ã€ãããéžæãããŸãã ãã®ãããªäžæã®åãååšããªãå Žåã¯ãã³ã³ãã€ã«æãšã©ãŒã§ãã -
Tã class_type ã§ãIããã® class_typeã®ã€ã³ã¹ã¿ã³ã¹ ãã£ãŒã«ããèå¥ããå Žå:-
Eã®å€ãnullã®å ŽåãSystem.NullReferenceExceptionãã¹ããŒãããŸãã - ãã以å€ã®å Žåããã£ãŒã«ããèªã¿åãå°çšã§ããã®ãã£ãŒã«ãã宣èšãããŠããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã®å€éšã§åç
§ãçºçããå Žåãçµæã¯å€ã«ãªããŸããã€ãŸãã
Iã«ãã£ãŠåç §ããããªããžã§ã¯ãå ã®ãã£ãŒã«ãEã®å€ã§ãã - ãã以å€ã®å Žåãçµæã¯å€æ°ãã€ãŸãã
Iã«ãã£ãŠåç §ããããªããžã§ã¯ãå ã®ãã£ãŒã«ãEã§ãã
-
-
Tã struct_type ã§ãIããã® struct_typeã®ã€ã³ã¹ã¿ã³ã¹ ãã£ãŒã«ããèå¥ããå Žå:-
Eãå€ã§ããå ŽåããŸãã¯ãã£ãŒã«ããèªã¿åãå°çšã§ããã®ãã£ãŒã«ãã宣èšãããŠããæ§é äœã®ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã®å€éšã§åç §ãçºçããå Žåãçµæã¯å€ã«ãªããŸããã€ãŸããIã«ãã£ãŠæå®ãããæ§é äœã€ã³ã¹ã¿ã³ã¹å ã®ãã£ãŒã«ãEã®å€ã«ãªããŸãã - ãã以å€ã®å Žåãçµæã¯å€æ°ã«ãªããŸããã€ãŸãã
Iã«ãã£ãŠæå®ãããæ§é äœã€ã³ã¹ã¿ã³ã¹å ã®ãã£ãŒã«ãEã§ãã
-
-
Iãã€ã³ã¹ã¿ã³ã¹ ã€ãã³ããèå¥ããå Žå:- ã€ãã³ãã宣èšãããŠããã¯ã©ã¹ãŸãã¯æ§é äœå
ã§åç
§ãçºçããevent_accessor_declarations (§15.8.1) ãªãã§ã€ãã³ãã宣èšããããã€åç
§ã
a +=æŒç®åãŸãã¯-=æŒç®åã®å·ŠåŽãšããŠçºçããªãå ŽåãE.Iã¯ãŸãã§Iãã€ã³ã¹ã¿ã³ã¹ãã£ãŒã«ãã§ãããã®ããã«æ£ç¢ºã«åŠçãããŸãã - ãã以å€ã®å Žåãçµæã¯ã
Eã®ã€ã³ã¹ã¿ã³ã¹åŒãé¢é£ä»ããããã€ãã³ã ã¢ã¯ã»ã¹ã«ãªããŸãã
- ã€ãã³ãã宣èšãããŠããã¯ã©ã¹ãŸãã¯æ§é äœå
ã§åç
§ãçºçããevent_accessor_declarations (§15.8.1) ãªãã§ã€ãã³ãã宣èšããããã€åç
§ã
- æåã«ã
- ãã以å€ã®å Žåã¯ã
E.Iãæ¡åŒµã¡ãœããåŒã³åºããšããŠåŠçããŸãïŒÂ§12.8.10.3ïŒã ããã倱æããå ŽåãE.Iã¯ç¡å¹ãªã¡ã³ããŒæ€çŽ¢ã§ããããã€ã³ãæãšã©ãŒãçºçããŸãã
12.8.7.2 åãåçŽãªååãšåå
ãã©ãŒã E.Iã®ã¡ã³ã㌠ã¢ã¯ã»ã¹ã§ã¯ãEãåäžã®èå¥åã§ãããsimple_nameãšããŠã®Eã®æå³ (§12.8.4) ã宿°ããã£ãŒã«ããããããã£ãããŒã«ã«å€æ°ããŸãã¯ãã©ã¡ãŒã¿ãŒã§ãããtype_nameãšããŠã®Eã®æå³ (§7.7.1) ãšåãåã§ããå Žåã¯ãEã®äž¡æ¹ã®æå³ãèš±å¯ãããŸãã
E.I ã®ã¡ã³ããŒæ€çŽ¢ã¯ãã©ã¡ãã®å Žåã I ãå¿
ãå E ã®ã¡ã³ããŒã«ãªãã®ã§ã決ããŠææ§ã«ã¯ãªããŸããã ã€ãŸãããã®èŠåã¯ãã³ã³ãã€ã«æãšã©ãŒãçºçãã E ã®éçã¡ã³ããŒãšå
¥ãåã«ãªã£ãåãžã®ã¢ã¯ã»ã¹ãèš±å¯ããã ãã§ãã
äŸ:
struct Color { public static readonly Color White = new Color(...); public static readonly Color Black = new Color(...); public Color Complement() => new Color(...); } class A { public «Color» Color; // Field Color of type Color void F() { Color = «Color».Black; // Refers to Color.Black static member Color = Color.Complement(); // Invokes Complement() on Color field } static void G() { «Color» c = «Color».White; // Refers to Color.White static member } }説æç®çã§ã®ã¿ã
Aã¯ã©ã¹å ã«ãããColorèå¥åã®ãã¡ãColoråãåç §ãããã®ã¯Â«...»ã§åºåãããColorãã£ãŒã«ããåç §ãããã®ã¯åºåãããŸãããçµäºãµã³ãã«
ãã©ã€ã㪠ã³ã³ã¹ãã©ã¯ã¿ãŒ (§15.11.6) ã«é¢ããŠãäžèšã®èŠåã¯ãã€ã³ã¹ã¿ã³ã¹ ã¡ã³ããŒå
ã®èå¥åãååç
§ãšããŠæ±ããããã©ã€ã㪠ã³ã³ã¹ãã©ã¯ã¿ãŒ ãã©ã¡ãŒã¿ãŒåç
§ãšããŠæ±ããã«åœ±é¿ããŸããããã¯ããã©ã¡ãŒã¿ãŒãå€åŽã®åã®ç¶æ
ã«ãã£ããã£ããŸãã " E.I ã®ã¡ã³ããŒåç
§ããããŸãã«ãªãããšã¯ãããŸããã"ãåç
§ã«ãã£ãŠã¡ã³ã㌠ã°ã«ãŒããçæãããå Žåã§ããã¡ã³ã㌠ã¢ã¯ã»ã¹ãéçã¡ã³ããŒãŸãã¯ã€ã³ã¹ã¿ã³ã¹ ã¡ã³ããŒãåç
§ããŠãããã©ããããã¡ã³ã㌠ã¢ã¯ã»ã¹ãå®å
šã«è§£æ±º (ãã€ã³ã) ããã«å€æã§ããªãå ŽåããããŸãã åæã«ããã©ã€ã㪠ã³ã³ã¹ãã©ã¯ã¿ãŒ ãã©ã¡ãŒã¿ãŒããã£ããã£ãããšãã»ãã³ãã£ãã¯åæã«åœ±é¿ãäžããæ¹æ³ã§ãå€åŽã®åã®ããããã£ã倿ŽãããŸãã ããšãã°ãåãã¢ã³ãããŒãžã«ãªãããã®ããç¹å®ã®å¶çŽã倱æããå¯èœæ§ããããŸãã ãã©ã¡ãŒã¿ãŒããã£ããã£ããããšèŠãªããããã©ããã«å¿ããŠãã©ã¡ãã®æ¹æ³ã§ããã€ã³ãã£ã³ã°ãæåããã·ããªãªããããŸãã
次ã®ãã¹ãŠã®æ¡ä»¶ãæºããããå Žåãã¡ã³ã㌠ã¢ã¯ã»ã¹ E.I ã®ãããŸãããšã©ãŒãçºçããŸãã
-
E.Iã®ã¡ã³ããŒæ€çŽ¢ã§ã¯ãã€ã³ã¹ã¿ã³ã¹ãšéçã¡ã³ããŒãåæã«å«ãã¡ã³ã㌠ã°ã«ãŒããçæãããŸãã åä¿¡åŽã®çš®é¡ã«é©çšã§ããæ¡åŒµã¡ãœããã¯ããã®ãã§ãã¯ã®ç®çã§ã€ã³ã¹ã¿ã³ã¹ ã¡ãœãããšããŠæ±ãããŸãã -
Eãååã§ã¯ãªãåçŽãªååãšããŠæ±ãããå Žåã¯ããã©ã€ã㪠ã³ã³ã¹ãã©ã¯ã¿ãŒ ãã©ã¡ãŒã¿ãŒãåç §ããå€åŽã®åã®ç¶æ ã«ãã©ã¡ãŒã¿ãŒããã£ããã£ããŸãã
12.8.8 Null æ¡ä»¶ä»ãã¡ã³ã㌠ã¢ã¯ã»ã¹
null_conditional_member_access ã¯ã member_access (§12.8.7) ã®æ¡ä»¶ä»ãããŒãžã§ã³ã§ãããçµæã®åã voidã§ããå Žåã¯ãã€ã³ãã£ã³ã°æéãšã©ãŒã§ãã çµæã®åã void ã§ããå¯èœæ§ããã null æ¡ä»¶åŒã«ã€ããŠã¯ã(§12.8.11)ãåç
§ããŠãã ããã
null_conditional_member_accessã¯ãprimary_expressionã®åŸã« 2 ã€ã®ããŒã¯ã³ "?" ãš "." ãç¶ãããã®åŸã«çç¥å¯èœãªtype_argument_listãæã€èå¥åãç¶ãããã®åŸã« 0 å以äžã®dependent_accessãç¶ãããã®åã« null_forgiving_operator ãä»ããããšãã§ããŸãã
null_conditional_member_access
: primary_expression '?' '.' identifier type_argument_list?
(null_forgiving_operator? dependent_access)*
;
dependent_access
: '.' identifier type_argument_list? // member access
| '[' argument_list ']' // element access
| '(' argument_list? ')' // invocation
;
null_conditional_projection_initializer
: primary_expression '?' '.' identifier type_argument_list?
;
null_conditional_member_access åŒ E ã¯ãP?.A ã®åœ¢åŒã§ãã
E ã®æå³ã¯æ¬¡ã®ããã«æ±ºå®ãããŸãã
Pã®åã null 蚱容å€åã®å Žå:TãP.Value.Aã®çš®é¡ãšããŸããTãåç §åãŸã㯠null é蚱容å€åã®ãããã§ããªãåãã©ã¡ãŒã¿ãŒã§ããå Žåãã³ã³ãã€ã«æãšã©ãŒãçºçããŸããTã null é蚱容å€åã®å ŽåãEã®åã¯T?ãããEã®æå³ã¯æ¬¡ã®æå³ãšåãã§ãã((object)P == null) ? (T?)null : P.Value.Aãã ãã
Pãè©äŸ¡ãããã®ã¯ 1 åã ãã§ãããã以å€ã®å Žåã
Eã®åã¯TãšãªããEã®æå³ã¯æ¬¡ã®æå³ãšåãã«ãªããŸãã((object)P == null) ? (T)null : P.Value.Aãã ãã
Pãè©äŸ¡ãããã®ã¯ 1 åã ãã§ãã
ãã以å€ã®å Žå:
åŒ
Tã®åãšããŠP.Aãå®çŸ©ããŸããããTãåç §åãŸã㯠null é蚱容å€åã®ãããã§ããªãåãã©ã¡ãŒã¿ãŒã§ããå Žåãã³ã³ãã€ã«æãšã©ãŒãçºçããŸããTã null é蚱容å€åã®å ŽåãEã®åã¯T?ãããEã®æå³ã¯æ¬¡ã®æå³ãšåãã§ãã((object)P == null) ? (T?)null : P.Aãã ãã
Pãè©äŸ¡ãããã®ã¯ 1 åã ãã§ãããã以å€ã®å Žåã
Eã®åã¯TãšãªããEã®æå³ã¯æ¬¡ã®æå³ãšåãã«ãªããŸãã((object)P == null) ? (T)null : P.Aãã ãã
Pãè©äŸ¡ãããã®ã¯ 1 åã ãã§ãã
泚æ: 次ã®åœ¢åŒã®åŒã«ãããŠ:
P?.Aâ?.Aâ
Pãnullã§ããã°ãAâãAâãè©äŸ¡ãããŸããã åŒã null_conditional_member_access ããã³ null_conditional_element_accessãå«ãäžé£ã®æäœã§ããå Žåãåæ§ã§ã (§12.8.13)ãæ³šé
null_conditional_projection_initializer ã¯ãnull_conditional_member_access ã®å¶éã§ãããåãã»ãã³ãã£ã¯ã¹ãæã£ãŠããŸãã å¿åãªããžã§ã¯ãäœæåŒ (§12.8.17.3) ã®ãããžã§ã¯ã·ã§ã³åæååãšããŠã®ã¿çºçããŸãã
12.8.9 Null-forgiving åŒ
12.8.9.1 å šè¬
null ã蚱容ããåŒã®å€ãåãåé¡ (§12.2) ãšã»ãŒã ã³ã³ããã¹ã (§16.8.15) ã¯ã ãã®primary_expressionã®å€ãåãåé¡ãããã³ã»ãŒã ã³ã³ããã¹ãã§ãã
null_forgiving_expression
: primary_expression null_forgiving_operator
;
null_forgiving_operator
: '!'
;
泚æ: åŸçœ®ã® null 蚱容æŒç®åãšãã¬ãã£ãã¯ã¹è«çåŠå®æŒç®å (§12.9.4) ã¯ãåãåå¥ããŒã¯ã³ (!) ã§è¡šãããŸãããç°ãªããŸãã ãªãŒããŒããŒãã§ããã®ã¯åŸè
(§15.10) ã ãã§ããnull 蚱容æŒç®åã®å®çŸ©ã¯åºå®ãããŠããŸãã
泚é
åãåŒã«å¯Ÿã㊠null 蚱容æŒç®åãè€æ°åé©çšãããšãéäžã«ãã£ããå ¥ã£ãŠããŠãã³ã³ãã€ã«æã«ãšã©ãŒãçºçããŸãã
äŸ:以äžã¯ãã¹ãŠç¡å¹ã«ãªããŸãã
var p = q!!; // error: applying null_forgiving_operator more than once var s = ( ( m(t) ! ) )! // error: null_forgiving_operator applied twice to m(t)çµäºãµã³ãã«
ãã®ãµãã¯ã©ãŠã¹ã𿬡ã®å åŒãµãã¯ã©ãŠã¹ã®æ®ãã®éšåã¯ãæ¡ä»¶ä»ãã§èŠç¯çã§ãã
éç null ç¶æ åæ (§8.9.5) ãå®è¡ããã³ã³ãã€ã©ã¯ã次ã®ä»æ§ã«æºæ ããå¿ èŠããããŸãã
null 蚱容æŒç®åã¯ãã³ã³ãã€ã«æã®æ¬äŒŒæŒç®ã§ãããã³ã³ãã€ã©ã®éç null ç¶æ åæãéç¥ããããã«äœ¿çšãããŸãã ããã«ã¯ãåŒãnull ã§ããå¯èœæ§ããããšããã³ã³ãã€ã©ã®å€æããªãŒããŒã©ã€ãããããšãããã³ null 蚱容æ§ã«é¢ããèŠåãåºãã³ã³ãã€ã©ããªãŒããŒã©ã€ãããããšã®2ã€ã®çšéããããŸãã
ã³ã³ãã€ã©ã®éç null ç¶æ åæã§èŠåãçæãããªãåŒã« null 蚱容æŒç®åãé©çšããŠããšã©ãŒã§ã¯ãããŸããã
12.8.9.2 "null ãšãªããããããªã" å€å®ãäžæžããã
ç¶æ³ã«ãã£ãŠã¯ãã³ã³ãã€ã©ã®éç null ç¶æ åæã«ãã£ãŠãåŒã« null ç¶æ null ããããšå€æãããä»ã®æ å ±ãåŒã null ã«ã§ããªãããšã瀺ãå Žåã«èšºæèŠåãçºè¡ããããšããããŸãã ãã®ãããªåŒã« null 蚱容æŒç®åãé©çšãããšãã³ã³ãã€ã©ã®éç㪠null ç¶æ åæããnull ç¶æ ãã§ã¯ãªãããšãèªèããŸããããã«ããã蚺æèŠåãé²ããé²è¡äžã®åæã«åœ¹ç«ã€æ å ±ãæäŸã§ããŸãã
äŸ: 以äžã確èªããŠãã ããã
#nullable enable public static void M() { Person? p = Find("John"); // returns Person? if (IsValid(p)) { Console.WriteLine($"Found {p!.Name}"); // p cannot be null } } public static bool IsValid(Person? person) => person != null && person.Name != null;
IsValidãtrueãè¿ãå Žåãpã¯å®å šã«éåç §ããŠãã®Nameããããã£ã«ã¢ã¯ã»ã¹ã§ãã"null ã§ããå¯èœæ§ã®ããå€ã®éåç §" èŠåã¯!ã䜿çšããŠæå¶ã§ããŸããçµäºãµã³ãã«
äŸ: null ã蚱容ããæŒç®åã¯æ éã«äœ¿çšããå¿ èŠããããŸããæ¬¡ã®ç¹ãèæ ®ããŠãã ããã
#nullable enable int B(int? x) { int y = (int)x!; // quash warning, throw at runtime if x is null return y; }ããã§ã¯ãnull ã蚱容ããæŒç®åãå€åã«é©çšããã
xã®èŠåãç Žæ£ããŸãã ãã ããå®è¡æã«xãnullã®å Žåãnullã¯intã«ãã£ã¹ãã§ããªãããäŸå€ãã¹ããŒãããŸããçµäºãµã³ãã«
12.8.9.3 ä»ã® null åæèŠåã®ãªãŒããŒã©ã€ã
äžèšã®ããã« null å€å®ããªãŒããŒã©ã€ãããããšã«å ããŠãåŒã« 1 ã€ä»¥äžã®èŠåãå¿ èŠã§ãããšããã³ã³ãã€ã©ã®éç null ç¶æ åæã®å€æããªãŒããŒã©ã€ãããããšãå¿ èŠãªå ŽåããããŸãã ãã®ãããªåŒã« null ã蚱容ããæŒç®åãé©çšãããšãã³ã³ãã€ã©ã¯åŒã«å¯ŸããŠèŠåãçºè¡ããŸããã ããã«å¯ŸããŠãã³ã³ãã€ã©ã¯èŠåãçºè¡ããªãããšãéžæããããã«åæã倿Žããããšãã§ããŸãã
äŸ: 以äžã確èªããŠãã ããã
#nullable enable public static void Assign(out string? lv, string? rv) { lv = rv; } public string M(string? t) { string s; Assign(out s!, t ?? "«argument was null»"); return s; }ã¡ãœãã
Assignã®ãã©ã¡ãŒã¿lv&rvã®åã¯ãstring?ã§ãããlvã¯ãåºåãã©ã¡ãŒã¿ã§ãããã·ã³ãã«ãªå²ãåœãŠãå®è¡ãããŸããã¡ãœãã
Mã¯ãsåã®å€æ°stringãAssignã®åºåãã©ã¡ãŒã¿ãšããŠæž¡ããŸããsã null èš±å®¹å€æ°ã§ã¯ãªããããã³ã³ãã€ã©ã«ãã£ãŠèŠåãçºè¡ãããŸããAssignã® 2 çªç®ã®åŒæ°ã null ã«ããããšã¯ã§ããŸãããnull ã蚱容ããæŒç®åã䜿çšããŠèŠåãç Žæ£ããŸããçµäºãµã³ãã«
æ¡ä»¶ä»ãã§èŠç¯çãªããã¹ãã®æ«å°Ÿã
12.8.10 åŒã³åºãåŒ
12.8.10.1 å šè¬
invocation_expression ã¯ãã¡ãœãããåŒã³åºãããã«äœ¿çšãããŸãã
invocation_expression
: primary_expression '(' argument_list? ')'
;
delegate_type ãããå Žåã«éããprimary_expression ã¯ãnull_forgiving_expression ãšãªãå ŽåããããŸãã
次ã®å°ãªããšã 1 ã€ãä¿æãããŠããå Žåã invocation_expression ã¯åçã«ãã€ã³ããããŸã (§12.3.3)ã
-
primary_expression ã«ã¯ã³ã³ãã€ã«æã®å
dynamicããããŸãã - çç¥å¯èœãªåŒæ°ãªã¹ã ã®äžã«å°ãªããšã 1 ã€ãã³ã³ãã€ã«æã®åã
dynamicã§ããåŒæ°ããããŸãã
ãã®å Žåã invocation_expression 㯠dynamicåã®å€ãšããŠåé¡ãããŸãã
invocation_expression ã®æå³ã決å®ãã以äžã®èŠåã¯ãprimary_expression ã®ã³ã³ãã€ã«æåã§ã¯ãªããã©ã³ã¿ã€ã æåããã³ã³ã³ãã€ã«æå dynamic ãããåŒæ°ã䜿çšããŠã©ã³ã¿ã€ã æã«é©çšãããŸãã
primary_expression ã«ã³ã³ãã€ã«æã®å dynamicããªãå Žåã §12.6.5ã§èª¬æãããŠããããã«ãã¡ãœããã®åŒã³åºãã§ã³ã³ãã€ã«æã®ãã§ãã¯ãå¶éãããŸãã
invocation_expression ã® primary_expression ã¯ãã¡ãœããã°ã«ãŒããŸãã¯ãdelegate_type ã® å€ã«ãªããŸãã primary_expression ãã¡ãœãã ã°ã«ãŒãã®å Žåã invocation_expression ã¯ã¡ãœããåŒã³åºãã§ã (§12.8.10.2)ã primary_expression ã delegate_typeã®å€ã§ããå Žåã invocation_expression ã¯ããªã²ãŒãåŒã³åºãã§ã (§12.8.10.4)ã primary_expression ãã¡ãœãã ã°ã«ãŒãã§ã delegate_typeã®å€ã§ããªãå Žåã¯ããã€ã³ãæãšã©ãŒãçºçããŸãã
çç¥å¯èœãª argument_list (§12.6.2) ã¯ãã¡ãœããã®ãã©ã¡ãŒã¿ãŒã®å€ãŸãã¯å€æ°åç §ãæäŸããŸãã
invocation_expression ãè©äŸ¡ããçµæã¯ã次ã®ããã«åé¡ãããŸãã
- invocation_expressionãæ»ãå€ãªãã®ã¡ãœãã (§15.6.1) ãŸãã¯æ»ãå€ãªãã®ããªã²ãŒããåŒã³åºããå Žåãçµæã¯äœããããŸããã äœãæå®ãããŠããªãåŒã¯ã statement_expression (§13.7) ã®ã³ã³ããã¹ããŸã㯠lambda_expression (§12.22) ã®æ¬äœãšããŠã®ã¿èš±å¯ãããŸãã ãã以å€ã®å Žåã¯ããã€ã³ãæãšã©ãŒãçºçããŸãã
- ãã以å€ã®å Žåã invocation_expression ã return-by-ref ã¡ãœãã (§15.6.1) ãŸã㯠return-by-ref ããªã²ãŒããåŒã³åºãå Žåãçµæã¯ã¡ãœãããŸãã¯ããªã²ãŒãã®æ»ãå€ã®åã«é¢é£ä»ããããåãæã€å€æ°ã«ãªããŸãã åŒã³åºããã€ã³ã¹ã¿ã³ã¹ ã¡ãœããã®å Žåãåä¿¡åŽãã¯ã©ã¹å
Tã®å Žåãé¢é£ä»ããããŠããåã¯ãTã§éå§ããåºåºã¯ã©ã¹ãæ€çŽ¢ãããšãã«èŠã€ãã£ãã¡ãœããã®æåã®å®£èšãŸãã¯ãªãŒããŒã©ã€ãããéžæãããŸãã åŒã³åºããã€ã³ã¹ã¿ã³ã¹ ã¡ãœããã§ãåä¿¡åŽãã€ã³ã¿ãŒãã§ã€ã¹åTã®å Žåãé¢é£ä»ããããŠããåã¯ãTãšãã®çŽæ¥ãŸãã¯éæ¥çãªåºæ¬ã€ã³ã¿ãŒãã§ã€ã¹ã®äžãããæãå ·äœç㪠(§19.4.10) ã€ã³ã¿ãŒãã§ã€ã¹ã§èŠã€ãã£ãã¡ãœããã®å®£èšãŸãã¯ãªãŒããŒã©ã€ãããéžæãããŸãã ãã®ãããªäžæã®åãååšããªãå Žåã¯ãã³ã³ãã€ã«æãšã©ãŒã§ãã - ãã以å€ã®å Žåã invocation_expression ã¯æ»ãå€ã«ããã¡ãœãã (§15.6.1) ãŸãã¯å€ããšã®æ»ãå€ããªã²ãŒããåŒã³åºããçµæã¯ãã¡ãœãããŸãã¯ããªã²ãŒãã®æ»ãå€ã®åã«é¢é£ä»ããããå€ã«ãªããŸãã åŒã³åºããã€ã³ã¹ã¿ã³ã¹ ã¡ãœããã®å Žåãåä¿¡åŽãã¯ã©ã¹å
Tã®å Žåãé¢é£ä»ããããŠããåã¯ãTã§éå§ããåºåºã¯ã©ã¹ãæ€çŽ¢ãããšãã«èŠã€ãã£ãã¡ãœããã®æåã®å®£èšãŸãã¯ãªãŒããŒã©ã€ãããéžæãããŸãã åŒã³åºããã€ã³ã¹ã¿ã³ã¹ ã¡ãœããã§ãåä¿¡åŽãã€ã³ã¿ãŒãã§ã€ã¹åTã®å Žåãé¢é£ä»ããããŠããåã¯ãTãšãã®çŽæ¥ãŸãã¯éæ¥çãªåºæ¬ã€ã³ã¿ãŒãã§ã€ã¹ã®äžãããæãå ·äœç㪠(§19.4.10) ã€ã³ã¿ãŒãã§ã€ã¹ã§èŠã€ãã£ãã¡ãœããã®å®£èšãŸãã¯ãªãŒããŒã©ã€ãããéžæãããŸãã ãã®ãããªäžæã®åãååšããªãå Žåã¯ãã³ã³ãã€ã«æãšã©ãŒã§ãã
泚: 次ã¯ãå®å šã§ãªãã³ãŒãã«ã®ã¿é©çšãããŸãã æ³šé
ã¢ã³ãããŒãž ã¡ãœãã ã®method_declaration§15.6.1 ã«ã¯ã屿§ã System.Runtime.InteropServices.UnmanagedCallersOnlyAttributeã ã¡ãœããã§ãã®å±æ§ã䜿çšãããšã次ã®å¶çŽãçããŸãã
- C# ãããã®ã¡ãœãããçŽæ¥åŒã³åºããšãšã©ãŒã«ãªããŸãã 代ããã«ããã®ã¡ãœãããžã®é¢æ°ãã€ã³ã¿ãŒ (§24.3.3) ãååŸãããã®ãã€ã³ã¿ãŒãä»ããŠã¡ãœãããåŒã³åºãããšãã§ããŸãã
-
unmanaged_typeã§ã¯ãªããã©ã¡ãŒã¿ãŒãŸãã¯æ»ãå€ã®åãæã€ã¡ãœããã®ãšã©ãŒã§ã (§8.8)ã - ãããã®åãã©ã¡ãŒã¿ãŒã
unmanagedã«å¶éãããŠããå Žåã§ãããã®ã¡ãœããã«åãã©ã¡ãŒã¿ãŒããããšãšã©ãŒã«ãªããŸãã - ãã®ã¡ãœããããžã§ããªãã¯åã«å«ãŸããã®ã¯ãšã©ãŒã§ãã
- ãã®ã¡ãœãããããªã²ãŒãåã«å€æãããšãšã©ãŒã«ãªããŸãã
颿°ãã€ã³ã¿ãŒåŒã³åºãã®å Žåã invocation_expression ã® primary_expression 㯠funcptr_typeã®å€ã§ãªããã°ãªããŸããã ããã«ãã¡ãœãããfuncptr_typeãšåããã©ã¡ãŒã¿ãŒ ãªã¹ããæã€é¢æ°ã¡ã³ããŒã§ããããšã瀺ãå Žåãinvocation_expressionã®argument_listã«é¢ããŠãfuncptr_typeãé©çšãããŸã (§12.6.4.2)ã
ãã©ãŒã F(A)ã®é¢æ°ãã€ã³ã¿ãŒåŒã³åºãã®å®è¡æåŠç (Fã¯funcptr_typeã®primary_expressionã§ãããAã¯çç¥å¯èœãªargument_list) ã¯ãæ¬¡ã®æé ã§æ§æãããŸãã
-
Fãè©äŸ¡ãããŸãã ãã®è©äŸ¡ã«ãã£ãŠäŸå€ãçºçããå Žåããã以äžã®æé ã¯å®è¡ãããŸããã - åŒæ°ãªã¹ã
Aãè©äŸ¡ãããŸãã ãã®è©äŸ¡ã«ãã£ãŠäŸå€ãçºçããå Žåããã以äžã®æé ã¯å®è¡ãããŸããã -
Fã®å€ãæå¹ã§ããããšã確èªãããŸãã ãã®å€ãnullå Žåãå®è£ å®çŸ©ã®äŸå€ãã¹ããŒããããã以äžã®æé ã¯å®è¡ãããŸããã - ãã以å€ã®å Žåã
Fã¯ã¡ãœãããæããŸãã 颿°ã¡ã³ããŒã®åŒã³åºã (§12.6.6) ã¯ãFãã€ã³ãå ã®ã¡ãœããã«å¯ŸããŠå®è¡ãããŸãã
12.8.10.2 Method Invocations
ã¡ãœããåŒã³åºãã®å Žåã invocation_expression ã® primary_expression ã¯ã¡ãœãã ã°ã«ãŒãã§ããå¿ èŠããããŸãã ã¡ãœãã ã°ã«ãŒãã¯ãåŒã³åºã 1 ã€ã®ã¡ãœããããŸãã¯åŒã³åºãç¹å®ã®ã¡ãœãããéžæãããªãŒããŒããŒããããã¡ãœããã®ã»ãããèå¥ããŸãã åŸè ã®å ŽåãåŒã³åºãç¹å®ã®ã¡ãœããã®æ±ºå®ã¯ã argument_listã®åŒæ°ã®åã«ãã£ãŠæäŸãããã³ã³ããã¹ãã«åºã¥ããŸãã
ãã©ãŒã M(A)ã®ã¡ãœããåŒã³åºãã®ãã€ã³ãæåŠç (M ã¯ã¡ãœãã ã°ã«ãŒã (å Žåã«ãã£ãŠã¯ type_argument_listãå«ã) ã§ããã A ã¯çç¥å¯èœãª argument_listã§ãããæ¬¡ã®æé ã§æ§æãããŸãã
- ã¡ãœããåŒã³åºãã®åè£ã¡ãœããã®ã»ãããæ§ç¯ãããŸãã ã¡ãœãã ã°ã«ãŒã
Fã«é¢é£ä»ããããŠããã¡ãœããMããšã«ãæ¬¡ã®æé ãå®è¡ããŸãã-
Fãéãžã§ããªãã¯ã®å ŽåãFã¯æ¬¡ã®å Žåã«åè£ã«ãªããŸãã-
Mã«ã¯ååŒæ°ãªã¹ãããããŸããã -
Fã¯ãA(§12.6.4.2) ã«é©çšãããŸãã
-
-
Fããžã§ããªãã¯ã§ãMã«ååŒæ°ãªã¹ãããªãå ŽåãFã¯æ¬¡ã®å Žåã«åè£ã«ãªããŸãã- åã®æšè« (§12.6.3) ãæåããåŒã³åºãã®ååŒæ°ã®äžèŠ§ãæšè«ããã
- æšè«ãããååŒæ°ã察å¿ããã¡ãœããåãã©ã¡ãŒã¿ãŒã«çœ®ãæãããããšã
Fã®ãã©ã¡ãŒã¿ãŒ ãªã¹ãå ã®ãã¹ãŠã®æ§ç¯ãããåããã®å¶çŽ (§8.4.5) ãæºãããFã®ãã©ã¡ãŒã¿ãŒ ãªã¹ããA(§12.6.4.2) ã«é©çšãããŸãã
-
Fããžã§ããªãã¯ã§ãMã«ååŒæ°ãªã¹ããå«ãŸããŠããå ŽåãFã¯æ¬¡ã®å Žåã«åè£ã«ãªããŸãã-
Fã¯ãååŒæ°ãªã¹ãã§æå®ãããã®ãšåãæ°ã®ã¡ãœããåãã©ã¡ãŒã¿ãŒãæã¡ã - ååŒæ°ã察å¿ããã¡ãœããåãã©ã¡ãŒã¿ãŒã«çœ®ãæãããããšã
Fã®ãã©ã¡ãŒã¿ãŒ ãªã¹ãå ã®ãã¹ãŠã®æ§ç¯ãããåããã®å¶çŽ (§8.4.5) ãæºãããFã®ãã©ã¡ãŒã¿ãŒ ãªã¹ããA(§12.6.4.2) ã«é©çšãããŸãã
-
-
- åè£ã¡ãœããã®ã»ããã¯ãæã掟çããåã®ã¡ãœããã®ã¿ãå«ãããçž®å°ãããŸããã»ããå
ã®
C.Fã¡ãœããããšã«ãCã¯ã¡ãœããFã宣èšãããŠããåã§ãããåºæ¬åã®Cã§å®£èšãããŠãããã¹ãŠã®ã¡ãœãããã»ããããåé€ãããŸãã ããã«ãCãobject以å€ã®ã¯ã©ã¹åã®å Žåãã€ã³ã¿ãŒãã§ã€ã¹åã§å®£èšãããŠãããã¹ãŠã®ã¡ãœãããã»ããããåé€ãããŸããæ³š: ãã®åŸè ã®èŠåã¯ãã¡ãœãã ã°ã«ãŒããã
object以å€ã®æå¹ãªåºåºã¯ã©ã¹ãšç©ºã§ãªãæå¹ãªã€ã³ã¿ãŒãã§ã€ã¹ ã»ãããæã€åãã©ã¡ãŒã¿ãŒã«å¯Ÿããã¡ã³ããŒæ€çŽ¢ã®çµæã§ããå Žåã«ã®ã¿æå¹ã§ãã æ³šé - çµæã®åè£ã¡ãœããã®ã»ããã空ã®å Žåãæ¬¡ã®æé ã«æ²¿ã£ãåŠçã¯äžæ¢ããã代ããã«æ¡åŒµã¡ãœããåŒã³åºããšããŠåŒã³åºããåŠçããããšããŸã (§12.8.10.3)ã ããã倱æããå Žåã¯ã該åœããã¡ãœãããååšããããã€ã³ãæãšã©ãŒãçºçããŸãã
- åè£ã¡ãœããã®ã»ããã®æé©ãªã¡ãœããã¯ã §12.6.4ã®ãªãŒããŒããŒã解決èŠå 䜿çšããŠèå¥ãããŸãã 1 ã€ã®æé©ãªã¡ãœãããèå¥ã§ããªãå Žåãã¡ãœããã®åŒã³åºãããããŸãã«ãªãããã€ã³ãæãšã©ãŒãçºçããŸãã ãªãŒããŒããŒã解決ãå®è¡ããå Žåããžã§ããªã㯠ã¡ãœããã®ãã©ã¡ãŒã¿ãŒã¯ã察å¿ããã¡ãœããåãã©ã¡ãŒã¿ãŒã®ååŒæ° (æå®ãŸãã¯æšè«) ã眮ãæããåŸã«èæ ®ãããŸãã
äžèšã®æé ã§ãã€ã³ãæã«ã¡ãœãããéžæããŠæ€èšŒãããšãå®éã®å®è¡æåŒã³åºãã¯ã §12.6.6ã§èª¬æãããŠãã颿°ã¡ã³ããŒåŒã³åºãã®èŠåã«åŸã£ãŠåŠçãããŸãã
泚: äžèšã®è§£æ±ºèŠåã®çŽæçãªå¹æã¯æ¬¡ã®ãšããã§ããã¡ãœããåŒã³åºãã«ãã£ãŠåŒã³åºãããç¹å®ã®ã¡ãœãããæ€çŽ¢ããã«ã¯ãã¡ãœããåŒã³åºãã«ãã£ãŠç€ºãããåããéå§ãã該åœãããã¢ã¯ã»ã¹å¯èœãªããªãŒããŒã©ã€ããããŠããªãã¡ãœãã宣èšãå°ãªããšã 1 ã€èŠã€ãããŸã§ç¶æ¿ãã§ãŒã³ãç¶è¡ããŸãã æ¬¡ã«ããã®åã§å®£èšãããŠãããã¢ã¯ã»ã¹å¯èœãªéãªãŒããŒã©ã€ã ã¡ãœããã®ã»ããã«å¯ŸããŠåã®æšè«ãšãªãŒããŒããŒãã®è§£æ±ºãå®è¡ããéžæãããã¡ãœãããåŒã³åºããŸãã ã¡ãœãããèŠã€ãããªãã£ãå Žåã¯ã代ããã«æ¡åŒµã¡ãœããåŒã³åºããšããŠåŒã³åºããåŠçããŠã¿ãŠãã ããã æ³šé
12.8.10.3 æ¡åŒµã¡ãœããã®åŒã³åºã
ããããã®ãã©ãŒã ã®ã¡ãœããåŒã³åºã (§12.8.10.2) ã§
«expr» . «identifier» ( )
«expr» . «identifier» ( «args» )
«expr» . «identifier» < «typeargs» > ( )
«expr» . «identifier» < «typeargs» > ( «args» )
åŒã³åºãã®éåžžã®åŠçã§è©²åœããã¡ãœãããèŠã€ãããªãå Žåã¯ãæ¡åŒµã¡ãœããåŒã³åºããšããŠã³ã³ã¹ãã©ã¯ããåŠçããããšããŸãã «expr» ãŸãã¯ãããã㮠«args» ã«ã³ã³ãã€ã«æã®å dynamicãããå Žåãæ¡åŒµã¡ãœããã¯é©çšãããŸããã
ç®çã¯ã察å¿ããéçã¡ãœããã®åŒã³åºããè¡ãããããã«ãæé©ãª type_nameCãèŠã€ããããšã§ãã
C . «identifier» ( «expr» )
C . «identifier» ( «expr» , «args» )
C . «identifier» < «typeargs» > ( «expr» )
C . «identifier» < «typeargs» > ( «expr» , «args» )
æ¡åŒµã¡ãœãã Cáµ¢.Mâ ã¯ã次ã®å Žå 察象㮠ã§ãã
-
Cáµ¢ã¯ãéãžã§ããªãã¯ã§å ¥ãåã«ãªã£ãŠããªãã¯ã©ã¹ã§ã -
Mâã®ååã¯ãèå¥åã§ã -
Mâã¯ã¢ã¯ã»ã¹å¯èœã§ãããäžèšã®ããã«éçã¡ãœãããšããŠåŒæ°ã«é©çšããå Žåã«é©çšã§ããŸã - æç€ºç㪠IDãåç
§ãããã¯ã¹åããã倿ã¯ãexpr ãã
Mâã®æåã®ãã©ã¡ãŒã¿åãžååšããŸãã
C ã®æ€çŽ¢ã¯æ¬¡ã®ããã«é²è¡ããŸãã
- æãè¿ãå²ãããåå空é宣èšããéå§ããåå²ãããåå空é宣èšãžé²ã¿ãå«ãŸããŠããã³ã³ãã€ã«åäœã§çµãããŸããæ¡åŒµã¡ãœããã®åè£ã»ãããæ€çŽ¢ããããã«é£ç¶çã«è©Šè¡ãããŸãã
- æå®ãããåå空éãŸãã¯ã³ã³ãã€ã«åäœã«ã驿 Œãªæ¡åŒµã¡ãœãã
Cáµ¢ãæã€éãžã§ããªãã¯å宣èšMâãçŽæ¥å«ãŸããŠããå Žåããããã®æ¡åŒµã¡ãœããã®ã»ãããåè£ã»ããã«ãªããŸãã - å
Cáµ¢using_static_directiveã«ãã£ãŠã€ã³ããŒããããæå®ãããåå空éãŸãã¯ã³ã³ãã€ã«åäœã®using_namespace_directiveã«ãã£ãŠã€ã³ããŒããããåå空éã§çŽæ¥å®£èšãããå«ãŸããã³ã³ãã€ã«åäœã«å°éããå Žåã¯ãglobal_using_static_directiveã«ãã£ãŠã€ã³ããŒããããããã°ã©ã å ã®global_using_namespace_directives ã«ãã£ãŠã€ã³ããŒããããåå空éã§çŽæ¥å®£èšãããå Žåã¯ã ã«ã¯ãMâå¯Ÿè±¡ã®æ¡åŒµã¡ãœãããçŽæ¥å«ãŸããŠããŸãããã®åŸããããã®æ¡åŒµã¡ãœããã®ã»ãããåè£ã»ããã«ãªããŸãã
- æå®ãããåå空éãŸãã¯ã³ã³ãã€ã«åäœã«ã驿 Œãªæ¡åŒµã¡ãœãã
- å€åŽã®åå空é宣èšãŸãã¯ã³ã³ãã€ã« åäœã§åè£ã»ãããèŠã€ãããªãå Žåã¯ãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
- ãã以å€ã®å Žåã¯ã §12.6.4ã§èª¬æãããŠããããã«ããªãŒããŒããŒã解決ãåè£ã»ããã«é©çšãããŸãã æé©ãªæ¹æ³ã 1 ã€ãèŠã€ãããªãå Žåã¯ãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
-
Cã¯ãæé©ãªã¡ãœãããæ¡åŒµã¡ãœãããšããŠå®£èšãããåã§ãã
C ãã¿ãŒã²ãããšããŠäœ¿çšãããšãã¡ãœããåŒã³åºãã¯éçã¡ãœããåŒã³åºã (§12.6.6) ãšããŠåŠçãããŸãã
泚: ã€ã³ã¹ã¿ã³ã¹ ã¡ãœããã®åŒã³åºããšã¯ç°ãªããexpr ã null åç §ã«è©äŸ¡ãããå ŽåãäŸå€ã¯ã¹ããŒãããŸããã 代ããã«ããã®
nullå€ã¯ãéåžžã®éçã¡ãœããåŒã³åºããä»ããŠè¡ãããããã«æ¡åŒµã¡ãœããã«æž¡ãããŸãã ãã®ãããªåŒã³åºãã«å¿çããæ¹æ³ã¯ãæ¡åŒµã¡ãœããã®å®è£ ã«ãã£ãŠæ±ºããããŸãã æ³šé
äžèšã®èŠåã¯ãã€ã³ã¹ã¿ã³ã¹ ã¡ãœãããæ¡åŒµã¡ãœãããããåªå ãããããšãæå³ããå éšåå空é宣èšã§äœ¿çšã§ããæ¡åŒµã¡ãœããã¯ãå€åŽã®åå空é宣èšã§äœ¿çšã§ããæ¡åŒµã¡ãœãããããåªå ãããåå空éã§çŽæ¥å®£èšãããæ¡åŒµã¡ãœããã¯ãusing åå空éãã£ã¬ã¯ãã£ãã䜿çšããŠåãåå空éã«ã€ã³ããŒããããæ¡åŒµã¡ãœãããããåªå ãããããšãæå³ããŸãã
äŸ:
public static class E { public static void F(this object obj, int i) { } public static void F(this object obj, string s) { } } class A { } class B { public void F(int i) { } } class C { public void F(object obj) { } } class X { static void Test(A a, B b, C c) { a.F(1); // E.F(object, int) a.F("hello"); // E.F(object, string) b.F(1); // B.F(int) b.F("hello"); // E.F(object, string) c.F(1); // C.F(object) c.F("hello"); // C.F(object) } }ãã®äŸã§ã¯ã
Bã®ã¡ãœãããæåã®æ¡åŒµã¡ãœãããããåªå ãããCã®ã¡ãœãããäž¡æ¹ã®æ¡åŒµã¡ãœãããããåªå ãããŸããpublic static class C { public static void F(this int i) => Console.WriteLine($"C.F({i})"); public static void G(this int i) => Console.WriteLine($"C.G({i})"); public static void H(this int i) => Console.WriteLine($"C.H({i})"); } namespace N1 { public static class D { public static void F(this int i) => Console.WriteLine($"D.F({i})"); public static void G(this int i) => Console.WriteLine($"D.G({i})"); } } namespace N2 { using N1; public static class E { public static void F(this int i) => Console.WriteLine($"E.F({i})"); } class Test { static void Main(string[] args) { 1.F(); 2.G(); 3.H(); } } }åºåã¯æ¬¡ã®ãšããã§ãã
E.F(1) D.G(2) C.H(3)
D.Gã¯C.Gãããåªå ãããE.Fã¯D.FãšC.Fã®äž¡æ¹ãããåªå ãããŸããçµäºãµã³ãã«
12.8.10.4 ããªã²ãŒãã®åŒã³åºã
ããªã²ãŒãåŒã³åºãã®å Žåã invocation_expression ã® primary_expression 㯠delegate_typeã®å€ã«ãªããŸãã ããã«ã delegate_type ã delegate_typeãšåããã©ã¡ãŒã¿ãŒ ãªã¹ããæã€é¢æ°ã¡ã³ããŒã§ãããšèãããšã delegate_type ã¯ã invocation_expressionã® argument_list ã«å¯ŸããŠé©çšå¯èœ (§12.6.4.2) ã§ããå¿ èŠããããŸãã
ãã©ãŒã D(A)ã®ããªã²ãŒãåŒã³åºãã®å®è¡æåŠç (D 㯠delegate_type ã® primary_expression ã§ããã A ã¯çç¥å¯èœãª argument_listã§ã) ã¯ãæ¬¡ã®æé ã§æ§æãããŸãã
-
Dãè©äŸ¡ãããŸãã ãã®è©äŸ¡ã«ãã£ãŠäŸå€ãçºçããå Žåããã以äžã®æé ã¯å®è¡ãããŸããã - åŒæ°ãªã¹ã
Aãè©äŸ¡ãããŸãã ãã®è©äŸ¡ã«ãã£ãŠäŸå€ãçºçããå Žåããã以äžã®æé ã¯å®è¡ãããŸããã -
Dã®å€ãæå¹ã§ããããšã確èªãããŸããDã®å€ãnullã®å ŽåãSystem.NullReferenceExceptionãã¹ããŒããããã以äžã®æé ã¯å®è¡ãããŸããã - ãã以å€ã®å Žåã
Dã¯ããªã²ãŒã ã€ã³ã¹ã¿ã³ã¹ãžã®åç §ã§ãã 颿°ã¡ã³ããŒã®åŒã³åºã (§12.6.6) ã¯ãããªã²ãŒãã®åŒã³åºããªã¹ãå ã®åŒã³åºãå¯èœãªåãšã³ãã£ãã£ã«å¯ŸããŠå®è¡ãããŸãã ã€ã³ã¹ã¿ã³ã¹ãšã€ã³ã¹ã¿ã³ã¹ ã¡ãœããã§æ§æãããåŒã³åºãå¯èœãšã³ãã£ãã£ã®å ŽåãåŒã³åºãã®ã€ã³ã¹ã¿ã³ã¹ã¯åŒã³åºãå¯èœãšã³ãã£ãã£ã«å«ãŸããã€ã³ã¹ã¿ã³ã¹ã§ãã
ãã©ã¡ãŒã¿ãŒã®ãªãè€æ°ã®åŒã³åºããªã¹ãã®è©³çްã«ã€ããŠã¯ã §21.6 ãåç §ããŠãã ããã
12.8.11 Null æ¡ä»¶ä»ãåŒã³åºãåŒ
null_conditional_invocation_expression ã¯æ§æäžãnull_conditional_member_access (§12.8.8) ãŸãã¯ãnull_conditional_element_access (§12.8.13) ãšãªããæåŸã® dependent_access ã¯ãåŒã³åºãåŒ (§12.8.10) ãšãªããŸãã
null_conditional_invocation_expressionã¯ãstatement_expression (§13.7)ãanonymous_function_body (§12.22.1)ããŸãã¯method_body (§15.6.1) ã®ã³ã³ããã¹ãå ã§çºçããŸãã
æ§æäžåçã® null_conditional_member_access ã null_conditional_element_accessãšã¯ç°ãªãã null_conditional_invocation_expression ã¯äœãåé¡ãããªãå ŽåããããŸãã
null_conditional_invocation_expression
: null_conditional_member_access null_forgiving_operator? '(' argument_list? ')'
| null_conditional_element_access null_forgiving_operator? '(' argument_list? ')'
;
ãªãã·ã§ã³ã® null_forgiving_operator ã¯ãnull_conditional_member_access ãŸã㯠null_conditional_element_access ã« delegate_typeãããå Žåã«éããå«ããããšãã§ããŸãã
null_conditional_invocation_expression åŒ E ã¯ã P?A圢åŒã§ããããã§ã A ã¯æ§æäžåçã® null_conditional_member_access ãŸã㯠null_conditional_element_accessã®æ®ãã®éšåã§ããããã A 㯠. ãŸã㯠[ã§å§ãŸããŸãã
PA
PãšAã®é£çµã瀺ããŸãã
E ã statement_expression ãšããŠçºçããå Žåã E ã®æå³ã¯ã ã¹ããŒãã¡ã³ãã®æå³ãšåãã§ãã
if ((object)P != null) PA
ãã ãã P ãè©äŸ¡ãããã®ã¯ 1 åã ãã§ãã
E ã anonymous_function_body ãŸã㯠method_body ãšããŠåºçŸããå Žåã E ã®æå³ã¯ãã®åé¡ã«ãã£ãŠç°ãªããŸãã
Eãäœãåé¡ãããªãå Žåããã®æå³ã¯ ãããã¯ã®æå³ãšåãã§ãã{ if ((object)P != null) PA; }ãã ãã
Pãè©äŸ¡ãããã®ã¯ 1 åã ãã§ãããã以å€ã®å Žåã
Eã®æå³ã¯ã ãããã¯ã®æå³ãšåãã§ãã{ return E; }ãããŠããã® ãããã¯ ã®æå³ã¯ã
Eã null_conditional_member_access (§12.8.8) ãŸã㯠null_conditional_element_access (§12.8.13) ãšæ§æçã«çãããã©ããã«ãã£ãŠç°ãªããŸãã
12.8.12 èŠçŽ ã¢ã¯ã»ã¹
12.8.12.1 å šè¬
element_accessã¯ãprimary_expressionã"[" ããŒã¯ã³ãargument_listããã®åŸã« "]" ããŒã¯ã³ã§æ§æãããŸãã
argument_list ã¯ã1 ã€ä»¥äžã® åŒæ°ã³ã³ãã§åºåã£ãŠæ§æãããŸãã
element_access
: primary_expression '[' argument_list ']'
;
element_accessãšpointer_element_access (§24.6.4) ã®äž¡æ¹ã®ä»£æ¿ææ®µãé©çšãããå Žåãprimary_expressionãèªèããå Žåã¯ãåã蟌ã¿primary_expressionããã€ã³ã¿ãŒå (§24.3) ã®å Žåã¯ãåŸè ãéžæããå¿ èŠããããŸãã
element_access ã® primary_expression ã¯ãarray_initializer ãå«ãŸããŠããªãéã array_creation_expression ã«ããããšã¯ã§ããŸããããŸããstackalloc_initializer ãå«ãŸããŠããªãéã stackalloc_expression ã«ããããšã¯ã§ããŸããã
泚: ãã®å¶éã¯ã次ã®ãããªæ··ä¹±ãæãå¯èœæ§ã®ããã³ãŒããçŠæ¢ããããã«ååšããŸãã
var a = new int[3][1];ãã以å€ã®å Žåã¯æ¬¡ã®ããã«è§£éãããŸãã
var a = (new int[3])[1];åæ§ã®å¶é㯠ãnull_conditional_element_access (§12.8.13) ã«é©çšãããŸãã æ³šé
次ã®å°ãªããšã 1 ã€ãä¿æãããŠããå Žåã element_access ã¯åçã«ãã€ã³ããããŸã (§12.3.3)ã
-
primary_expression ã«ã¯ã³ã³ãã€ã«æã®å
dynamicããããŸãã -
argument_listã®å°ãªããšã 1 ã€ã®åŒã«ã³ã³ãã€ã«æå
dynamicããããprimary_no_array_creation_expressionã«ã€ã³ã©ã€ã³é åå (§16.6) ããªãããargument_listã«è€æ°ã®åŒæ°ããããŸãã
ãã®å Žåã element_access ã®ã³ã³ãã€ã«æã®å㯠ãprimary_expressionã®ã³ã³ãã€ã«æã®åã«äŸåããŸããé
ååãããå Žåãã³ã³ãã€ã«æã®åã¯ãã®é
ååã®èŠçŽ åã«ãªããŸãããã以å€ã®å Žåãã³ã³ãã€ã«æã®å㯠dynamic ããã element_access 㯠dynamicåã®å€ãšããŠåé¡ãããŸãã 以äžã®èŠåã¯ãelement_access ã®æå³ã倿ããããã«ãã³ã³ãã€ã«æå ããã primary_expression åŒããã³ dynamic åŒã®ã³ã³ãã€ã«æã®åã§ã¯ãªããå®è¡æã®åã䜿çšããŠå®è¡æã«é©çšãããŸãã
primary_expressionã«ã³ã³ãã€ã«æã®ådynamicããªãå ŽåãèŠçŽ ã¢ã¯ã»ã¹ã§ã¯ã§12.6.5 ã§èª¬æãããŠããããã«ã³ã³ãã€ã«æã®ãã§ãã¯ãå¶éãããŸãã
äŸ:
var index = (dynamic)1; // index has compile-time type dynamic int[] a = {0, 1, 2}; var a_elem = a[index]; // dynamically bound, a_elem has compile-time type int string s = "012"; var s_elem = s[index]; // dynamcially bound, s_elem has compile-time type dynamicçµäºãµã³ãã«
element_accessã®primary_expressionãarray_typeã®å€ã§ããå Žåãelement_accessã¯é åã¢ã¯ã»ã¹ (§12.8.12.2) ã«ãªããŸãã ãã以å€ã®å Žåãelement_accessã®primary_no_array_creation_expressionãã€ã³ã©ã€ã³é ååã®å€æ°ãŸãã¯å€ã§ãããargument_listã 1 ã€ã®åŒæ°ã§æ§æãããŠããå Žåãelement_accessã¯ã€ã³ã©ã€ã³é åèŠçŽ ã¢ã¯ã»ã¹ã§ã (§12.8.12.3)ã ãã以å€ã®å Žåã primary_no_array_creation_expression ã¯ã1 ã€ä»¥äžã®ã€ã³ãã¯ãµãŒ ã¡ã³ããŒãæã€ã¯ã©ã¹ãæ§é äœããŸãã¯ã€ã³ã¿ãŒãã§ã€ã¹åã®å€æ°ãŸãã¯å€ã«ãªããŸãããã®å Žåã element_access ã¯ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã§ã (§12.8.12.5)ã
- é ååã®å€ã element_access ã¯é åã¢ã¯ã»ã¹ (§12.8.12.2) ã§ãã
-
stringåã®å€ãelement_accessã¯æååã¢ã¯ã»ã¹ (§12.8.12.4) ã§ãã - ãã以å€ã®å Žåã primary_expression ã¯ã1 ã€ä»¥äžã®ã€ã³ãã¯ãµãŒ ã¡ã³ããŒãæã€ã¯ã©ã¹ãæ§é äœããŸãã¯ã€ã³ã¿ãŒãã§ã€ã¹åã®å€æ°ãŸãã¯å€ã«ãªããŸãããã®å Žåã element_access ã¯ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã§ã (§12.8.12.5)ã
12.8.12.2 é åãžã®ã¢ã¯ã»ã¹
ã€ã³ã©ã€ã³é å (§16.6) å ã®èŠçŽ ãžã®ã¢ã¯ã»ã¹ã«ã€ããŠã¯ã §12.8.12.3 ãåç §ããŠãã ããã
é åã¢ã¯ã»ã¹ã®å Žåã argument_list ã«ã¯ååä»ãåŒæ°ãŸãã¯åç §æž¡ãåŒæ° (§15.6.2.3) ã¯å«ãŸããŸããã
argument_listå ã®åŒã®æ°ã¯ãarray_typeã®ã©ã³ã¯ãšåãã§ãååŒã¯æ¬¡ã®ããã«ãªããŸãã
-
intãuintãnintãnuintãlongããŸãã¯ulongã®åã - åäžã©ã³ã¯é
åã¢ã¯ã»ã¹ã®å Žåã®ã¿ã
IndexãŸãã¯Rangeã®åã - äžèšã®åã® 1 ã€ä»¥äžã«æé»çã«å€æã§ããŸãã
P[A]ã¯array_typeã®primary_expressionã§ãããPã¯ã€ã³ããã¯ã¹åŒã®argument_listã§ãããã©ãŒã Aã¢ã¯ã»ã¹ã®å®è¡æåŠçã¯ãæ¬¡ã®æé ã§æ§æãããŸãã
-
Pãè©äŸ¡ãããŸãã ãã®è©äŸ¡ã«ãã£ãŠäŸå€ãçºçããå Žåããã以äžã®æé ã¯å®è¡ãããŸããã -
argument_listå
ã®åã€ã³ããã¯ã¹åŒãå·Šããå³ã«é çªã«æå®ããŸãã
- ã€ã³ããã¯ã¹åŒãè©äŸ¡ãããçµæã®å€ã®åã T ã«ãªããŸãã
- ãã®åŸããã®å€ã¯ã
intãªå€æ (uint) ãååšãããlongãulongãIndexãRangeããŸãã¯åäžã©ã³ã¯é åã¢ã¯ã»ã¹ã®ã¿ããŸãã¯ã®åã«å€æãããŸãã - ã€ã³ããã¯ã¹åŒã®è©äŸ¡ãŸãã¯ãã®åŸã®æé»çãªå€æã«ãã£ãŠäŸå€ãçºçããå Žåããã以äžã®ã€ã³ããã¯ã¹åŒã¯è©äŸ¡ãããŸããããã以äžã®æé ã¯å®è¡ãããŸããã
-
Pã®å€ãæå¹ã§ããããšã確èªãããŸããPã®å€ãnullã®å ŽåãSystem.NullReferenceExceptionãã¹ããŒããããã以äžã®æé ã¯å®è¡ãããŸããã - äžèšã®æé ã§ã
Rangeåã®åäžã®ã€ã³ããã¯ã¹å€ãçæãããå Žåã¯ã次ã®ããã«ãªããŸãã-
L ã«ã
Pã«ãã£ãŠåç §ãããé åã®é·ããæå®ããŸãã -
A㯠L (§18.3) ã«å¯ŸããŠæå¹ã§ããããšã確èªããŸãã ããã§ãªãå Žåã¯ãSystem.ArgumentOutOfRangeExceptionãã¹ããŒããããã以äžã®æé ã¯å®è¡ãããŸããã - Lã«é¢ããã®éå§ãªãã»ãããSãããã³é
ç®æ°
Aã¯ãGetOffsetAndLengthã«ã€ããŠèª¬æããããã«æ±ºå®ããã(§18.3)ã - é
åã¢ã¯ã»ã¹ã®çµæã¯ãã€ã³ããã¯ã¹ S ããå§ãŸã
Pã® N åã®èŠçŽ ã®æµ ãã³ããŒãå«ãé åã§ããN ã 0 ã®å Žåãé åã«ã¯ 0 åã®èŠçŽ ããããŸãã
-
L ã«ã
æèšïŒS ãš N ã¯ã©ã¡ãããŒã ($24.3) ã«ããããšãã§ããŸãã éåžžã空ã®é åã®ã€ã³ããã¯ã¹äœæã¯ç¡å¹ã§ããããŒãããå§ãŸã空ã®ç¯å²ã§ã®ã€ã³ããã¯ã¹äœæã¯æå¹ã§ããã空ã®é åãè¿ããŸãã ãã®å®çŸ©ã§ã¯ ãS ã L ã«ããããšãã§ããŸãããã®å Žåãéå»ã®ã€ã³ããã¯ã¹ (§18.1) ãè¿ãããŸãããã®å Žå ãN 㯠0 ã«ãªãã空ã®é åãè¿ãããŸãã æ³šé
æèšïŒ é åã¢ã¯ã»ã¹ã䜿çšããŠé åã®èŠçŽ ã®ç¯å²ãå²ãåœãŠãããšã¯ã§ããŸããã ããã¯ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ (§12.8.12.5) ãšã¯ç°ãªããŸããããã¯ã
Rangeå€ã§æå®ãããã€ã³ããã¯ã¹ã®ç¯å²ãžã®å²ãåœãŠããµããŒãããå ŽåããããŸãããå¿ èŠãããŸããã æ³šé
- ãã以å€ã®å Žå:
- é åã¢ã¯ã»ã¹ãè©äŸ¡ããçµæã¯ãé åã®èŠçŽ åã®å€æ°åç § (§9.5) ã§ãã
-
argument_list å
ã®ååŒã®å€ã¯ã
Pã«ãã£ãŠåç §ãããé åã€ã³ã¹ã¿ã³ã¹ã®å次å ã®å®éã®å¢çã«å¯ŸããŠãã§ãã¯ãããŸãã 1 ã€ä»¥äžã®å€ãç¯å²å€ã®å ŽåãSystem.IndexOutOfRangeExceptionãã¹ããŒããããã以äžã®æé ã¯å®è¡ãããŸããã - ã€ã³ããã¯ã¹åŒã«ãã£ãŠæå®ãããé åèŠçŽ ã®å€æ°åç §ãèšç®ããããããé åã¢ã¯ã»ã¹ã®çµæã«ãªããŸãã
12.8.12.3 ã€ã³ã©ã€ã³é åèŠçŽ ã¢ã¯ã»ã¹
ã€ã³ã©ã€ã³é
å (§16.6) å
ã®èŠçŽ ã«ã¢ã¯ã»ã¹ããå Žåã element_access ã® primary_no_array_creation_expression ã¯ã€ã³ã©ã€ã³é
åãæå®ããå¿
èŠããããŸãã ããã«ã argument_list ã«ã¯ãååä»ã åŒæ° (§12.6.2.1) ã§ã¯ãªã 1 ã€ã®åŒæ°ãå«ããå¿
èŠããããŸãã ãã® åŒæ° ã¯ã intåã§ããããå intã System.IndexããŸã㯠System.Rangeã«æé»çã«å€æå¯èœã§ããå¿
èŠããããŸãã
åŒæ°ã宿°åŒã®å Žåã¯ã³ã³ãã€ã«æãšã©ãŒã§ãããã®çµæãã€ã³ã©ã€ã³é
åã®å¢çå€ã®ã€ã³ããã¯ã¹ãè¿ãããŸãã å®è¡æã« åŒæ° ã®å€ãã€ã³ã©ã€ã³é
åã®ç¯å²å€ã®ã€ã³ããã¯ã¹ã«ãªãå Žåã¯ã System.IndexOutOfRangeException ãã¹ããŒãããŸãã
åŒæ°ã®åãint
primary_no_array_creation_expressionãæžã蟌ã¿å¯èœãªå€æ°ã®å Žåãã€ã³ã©ã€ã³é åèŠçŽ ã®ã¢ã¯ã»ã¹ãè©äŸ¡ããçµæã¯ãã€ã³ãã¯ãµãŒã®åŒã³åºããšåçã®æžã蟌ã¿å¯èœãªå€æ°ã«ãªããŸã
public ref T this[int index] { get; }
åŒæ°ãã€ã³ããã¯ã¹ãšããŠäœ¿çšããprimary_no_array_creation_expressionã«ãã£ãŠæå®ãããã€ã³ã©ã€ã³é
åããäœæãããSystem.Span<T>ã®ã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠæå®ããŸãã ref-safety åæã®ç®çã§ãã¢ã¯ã»ã¹ã®ã»ãŒã ã³ã³ããã¹ã (§9.7.2.1) ã¯ãã·ã°ããã£ãæã€ã¡ãœããã®åŒã³åºãã®å Žåãšåãã§ã
static ref T GetItem(ref «InlineArrayType» array)
çµæã®å€æ°ã¯ãprimary_no_array_creation_expressionãç§»åå¯èœ ãªå Žåã«ã®ã¿ ç§»åå¯èœãšèŠãªãããŸãã
primary_no_array_creation_expressionãèªã¿åãå°çšå€æ°ã®å Žåãã€ã³ã©ã€ã³é åèŠçŽ ã®ã¢ã¯ã»ã¹ãè©äŸ¡ããçµæã¯ãã€ã³ãã¯ãµãŒã®åŒã³åºããšåçã®èªã¿åãå°çšå€æ°ã«ãªããŸã
public ref readonly T this[int index] { get; }
åŒæ°ãã€ã³ããã¯ã¹ãšããŠäœ¿çšããprimary_no_array_creation_expressionã«ãã£ãŠæå®ãããã€ã³ã©ã€ã³é
åããäœæãããSystem.ReadOnlySpan<T>ã®ã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠæå®ããŸãã ref-safety åæã®ç®çã§ã¯ãã¢ã¯ã»ã¹ã®ã»ãŒã ã³ã³ããã¹ãã¯ãã·ã°ããã£ãæã€ã¡ãœããã®åŒã³åºãã®å Žåãšåãã§ãã
static ref readonly T GetItem(in «InlineArrayType» array)
çµæã®å€æ°ã¯ãprimary_no_array_creation_expressionãç§»åå¯èœ ãªå Žåã«ã®ã¿ ç§»åå¯èœãšèŠãªãããŸãã
primary_no_array_creation_expressionãå€ã®å Žåãã€ã³ã©ã€ã³é åèŠçŽ ã®ã¢ã¯ã»ã¹ãè©äŸ¡ããçµæã¯ãã€ã³ãã¯ãµãŒã®åŒã³åºããšåçã®å€ã«ãªããŸã
public ref readonly T this[int index] { get; }
åŒæ°ãã€ã³ããã¯ã¹ãšããŠäœ¿çšããprimary_no_array_creation_expressionã«ãã£ãŠæå®ãããã€ã³ã©ã€ã³é
åããäœæãããSystem.ReadOnlySpan<T>ã®ã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠæå®ããŸãã ref-safety åæã®ç®çã§ã¯ãã¢ã¯ã»ã¹ã®ã»ãŒã ã³ã³ããã¹ãã¯ãã·ã°ããã£ãæã€ã¡ãœããã®åŒã³åºãã®å Žåãšåãã§ãã
static T GetItem(«InlineArrayType» array)
äŸ:
[System.Runtime.CompilerServices.InlineArray(10)] public struct Buffer10<T> { private T _element0; } public class Program { void M1(Buffer10<int> x) { ref int a = ref x[0]; // OK } void M2(in Buffer10<int> x) { ref readonly int a = ref x[0]; // OK ref int b = ref x[0]; // Error; x is readonly } Buffer10<int> GetBuffer() => default; void M3() { int a = GetBuffer()[0]; // OK ref readonly int b = ref GetBuffer()[0];// Error, rhs is a value ref int c = ref GetBuffer()[0]; // Error; rhs is a value } }çµäºãµã³ãã«
åŒæ°ã®åãæé»çã«å€æå¯èœãªå Žåint
åŒæ°ã®å€ã¯intã«å€æãããåŒæ°ã®åãæå®ãããŠããå ŽåãèŠçŽ ã®ã¢ã¯ã»ã¹ã¯èª¬æã©ããã«è§£éãããŸããint
åŒæ°ã®åãæé»çã«å€æå¯èœãªå ŽåSystem.Index
åŒæ° ã¯ã System.Index ã«å€æãããã€ã³ã©ã€ã³é
åã®å
é ããã®èŠçŽ ã®äœçœ®ã瀺ã intããŒã¹ã®ã€ã³ããã¯ã¹å€ã«å€æãããŸãã æ¬¡ã«ã åŒæ°ã®åã intããããšãã«ãèŠçŽ ã®ã¢ã¯ã»ã¹ã説æã©ããã«è§£éãããŸãã
éã€ã³ã©ã€ã³é
åå
ã®èŠçŽ ã«ã¢ã¯ã»ã¹ããããã« System.Index ã®ã€ã³ããã¯ã¹ã䜿çšããæ¹æ³ã«ã€ããŠã¯ã §12.8.12.2 ã§èª¬æãããŠããŸãã ãã ããã€ã³ã©ã€ã³é
åãSystem.Indexã䜿çšããŠã€ã³ããã¯ã¹ãäœæããå Žåããã®ããã»ã¹ã¯äœ¿çšãããªãããšã«æ³šæããŠãã ããã å
·äœçã«ã¯ãã€ã³ã©ã€ã³é
åèŠçŽ ã¢ã¯ã»ã¹ã¯ãã€ã³ã©ã€ã³é
ååã§å®£èšãããŠããã€ã³ãã¯ãµãŒããã¹ãŠç¡èŠããŸãã 詳现ã«ã€ããŠã¯ ã§16.6 ãåç
§ããŠãã ããã
åŒæ°ã®åãæé»çã«å€æå¯èœãªå ŽåSystem.Range
primary_no_array_creation_expressionãæžã蟌ã¿å¯èœãªå€æ°ã®å Žåãã€ã³ã©ã€ã³é åèŠçŽ ã®ã¢ã¯ã»ã¹ãè©äŸ¡ããçµæã¯ãã¡ãœããã®åŒã³åºããšåçã®å€æ°ã«ãªããŸã
public Span<T> Slice (int start, int length)
primary_no_array_creation_expressionã«ãã£ãŠæå®ãããã€ã³ã©ã€ã³é
åããäœæãããSystem.Span<T>ã®ã€ã³ã¹ã¿ã³ã¹ã§ãrange ã®éå§ã€ã³ããã¯ã¹ãšçµäºã€ã³ããã¯ã¹ã«çžåœããintãæž¡ããŸãã ref-safety åæã®ç®çã§ãã¢ã¯ã»ã¹ã®ã»ãŒã ã³ã³ããã¹ã (§9.7.2.1) ã¯ãã·ã°ããã£ãæã€ã¡ãœããã®åŒã³åºãã®å Žåãšåãã§ã
static System.Span<T> GetSlice(ref «InlineArrayType» array)
primary_no_array_creation_expressionãèªã¿åãå°çšå€æ°ã®å Žåãã€ã³ã©ã€ã³é åèŠçŽ ã®ã¢ã¯ã»ã¹ãè©äŸ¡ããçµæã¯ãã¡ãœããã®åŒã³åºããšåçã®å€ã«ãªããŸã
public ReadOnlySpan<T> Slice (int start, int length)
primary_no_array_creation_expressionã«ãã£ãŠæå®ãããã€ã³ã©ã€ã³é
åããäœæãããSystem.ReadOnlySpan<T>ã®ã€ã³ã¹ã¿ã³ã¹ã§ãrange ã®éå§ã€ã³ããã¯ã¹ãšçµäºã€ã³ããã¯ã¹ã«çžåœããintãæž¡ããŸãã ref-safety åæã®ç®çã§ã¯ãã¢ã¯ã»ã¹ã®ã»ãŒã ã³ã³ããã¹ãã¯ãã·ã°ããã£ãæã€ã¡ãœããã®åŒã³åºãã®å Žåãšåãã§ãã
static System.ReadOnlySpan<T> GetSlice(in «InlineArrayType» array)
éã€ã³ã©ã€ã³é
åå
ã®èŠçŽ ã«ã¢ã¯ã»ã¹ããããã« System.Range ã®ã€ã³ããã¯ã¹ã䜿çšããæ¹æ³ã«ã€ããŠã¯ã §12.8.12.2 ã§èª¬æãããŠããŸãã ãã ããã€ã³ã©ã€ã³é
åãSystem.Rangeã䜿çšããŠã€ã³ããã¯ã¹ãäœæããå Žåããã®ããã»ã¹ã¯äœ¿çšãããªãããšã«æ³šæããŠãã ããã å
·äœçã«ã¯ãã€ã³ã©ã€ã³é
åèŠçŽ ã¢ã¯ã»ã¹ã¯ãã€ã³ã©ã€ã³é
ååã§å®£èšããã Slice ã¡ãœãããç¡èŠããŸãã 詳现ã«ã€ããŠã¯ ã§16.6 ãåç
§ããŠãã ããã
primary_no_array_creation_expressionãå€ã®å Žåã¯ããšã©ãŒãå ±åãããŸãã
äŸ:
[System.Runtime.CompilerServices.InlineArray(10)] public struct Buffer10<T> { private T _element0; } public class Program { void M1(Buffer10<int> x) { System.Span<int> a = x[..]; // OK } void M2(in Buffer10<int> x) { System.ReadOnlySpan<int> a = x[..]; // OK System.Span<int> b = x[..]; // Error; no implicit conversion } Buffer10<int> GetBuffer() => default; void M3() { _ = GetBuffer()[..]; // Error; rhs is a value } }çµäºãµã³ãã«
12.8.12.4 æååã¢ã¯ã»ã¹
æååã¢ã¯ã»ã¹ã®å Žåã element_access ã® argument_list ã«ã¯ã1 ã€ã®ååã®ãªãå€åŒæ° (§15.6.2.2) ãå«ããå¿ èŠããããŸãããã®åŒæ°ã¯æ¬¡ã®ããã«ãªããŸãã
- å
intãIndexããŸãã¯Rangeã - äžèšã®åã® 1 ã€ä»¥äžã«æé»çã«å€æã§ããŸãã
ãã©ãŒã P[A]ã®æååã¢ã¯ã»ã¹ã®å®è¡æåŠç(Pã¯åã®stringã§ãAã¯åäžã®åŒã§ã)ã¯ãæ¬¡ã®æé ã§æ§æãããŸãã
-
Pãè©äŸ¡ãããŸãã ãã®è©äŸ¡ã«ãã£ãŠäŸå€ãçºçããå Žåããã以äžã®æé ã¯å®è¡ãããŸããã - ã€ã³ããã¯ã¹åŒãè©äŸ¡ãããçµæã®å€ã®åã T ã«ãªããŸãã
- ãã®åŸããã®å€ã¯ã
intããã®æé»çãªå€æ (Index) ãååšããæåã®å (RangeãããŸãã¯) ã«å€æãããŸãã - ã€ã³ããã¯ã¹åŒã®è©äŸ¡ãŸãã¯ãã®åŸã®æé»çãªå€æã«ãã£ãŠäŸå€ãçºçããå Žåããã以äžã®ã€ã³ããã¯ã¹åŒã¯è©äŸ¡ãããŸããããã以äžã®æé ã¯å®è¡ãããŸããã
-
Pã®å€ãæå¹ã§ããããšã確èªãããŸããPã®å€ãnullã®å ŽåãSystem.NullReferenceExceptionãã¹ããŒããããã以äžã®æé ã¯å®è¡ãããŸããã - äžèšã®æé ã§
Rangeåã®ã€ã³ããã¯ã¹å€ãçæãããå Žåã¯ã次ã®ããã«ãªããŸãã- æååã¢ã¯ã»ã¹ãè©äŸ¡ããçµæã¯ã
stringåã®å€ã«ãªããŸãã -
L ã«ã
Pã«ãã£ãŠåç §ãããæååã®é·ããæå®ããŸãã -
AL (§18.3) ã«å¯ŸããŠæå¹ã§ããããšã確èªãããŸããæå¹ã§ãªãå Žåã¯ãSystem.ArgumentOutOfRangeExceptionãã¹ããŒããããã以äžã®æé ã¯å®è¡ãããŸããã - Lã«é¢ããã®éå§ãªãã»ãããSãããã³é
ç®æ°
Aã¯ãGetOffsetAndLengthã«ã€ããŠèª¬æããããã«æ±ºå®ããã(§18.3)ã - æååã¢ã¯ã»ã¹ã®çµæã¯ãS ããå§ãŸã
Pã® N æåãã³ããŒããŠåœ¢æãããæååã§ã (N ã 0 ã®å Žåãæååã¯ç©ºã§ã)ã
- æååã¢ã¯ã»ã¹ãè©äŸ¡ããçµæã¯ã
æèšïŒS ãš N ã®äž¡æ¹ã 0 ã«ã§ããŸã (§18.3)ã éåžžãç©ºã®æååã®ã€ã³ããã¯ã¹äœæã¯ç¡å¹ã§ããããŒãããå§ãŸã空ã®ç¯å²ã§ã®ã€ã³ããã¯ã¹äœæã¯æå¹ã§ãããç©ºã®æååãè¿ããŸãã å®çŸ©ã§ã¯ã S ã L (éå»ã®ã€ã³ããã¯ã¹ (§18.1) ã«ããããšãã§ããŸãããã®å Žåã N 㯠0 ã«ãªããç©ºã®æååãè¿ãããŸãã æ³šé
- ãã以å€ã®å Žå:
- æååã¢ã¯ã»ã¹ãè©äŸ¡ããçµæã¯ã
charåã®å€ã«ãªããŸãã - 倿ãããã€ã³ããã¯ã¹åŒã®å€ã¯ã
Pã«ãã£ãŠåç §ãããæååã€ã³ã¹ã¿ã³ã¹ã®å®éã®å¢çã«å¯ŸããŠãã§ãã¯ãããŸãã å€ãç¯å²å€ã®å ŽåãSystem.IndexOutOfRangeExceptionãã¹ããŒããããã以äžã®æé ã¯å®è¡ãããŸããã - 倿ãããã€ã³ããã¯ã¹åŒã®ãªãã»ããã«ããæåå
Pã®æåã®å€ããæååã¢ã¯ã»ã¹ã®çµæã«ãªããŸãã
- æååã¢ã¯ã»ã¹ãè©äŸ¡ããçµæã¯ã
12.8.12.5 ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹
ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã®å Žåãelement_accessã®primary_expressionã¯ã¯ã©ã¹ãæ§é äœããŸãã¯ã€ã³ã¿ãŒãã§ã€ã¹åã®å€æ°ãŸãã¯å€ã§ããããã®åã¯ãelement_accessã®argument_listã«é©çšã§ãã 1 ã€ä»¥äžã®ã€ã³ãã¯ãµãŒãå®è£
ããå¿
èŠããããŸãã
argument_listã«ã¯ãoutãŸãã¯refåŒæ°ã¯å«ãŸããŸããã
ãã©ãŒã P[A]ã®ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã®ãã€ã³ãæåŠçã¯ãPãã¯ã©ã¹ãæ§é äœããŸãã¯ã€ã³ã¿ãŒãã§ã€ã¹åã®Tã§ãããAãargument_listã§ããå Žåãæ¬¡ã®æé ã§æ§æãããŸãã
-
Tã«ãã£ãŠæäŸãããã€ã³ãã¯ãµãŒã®ã»ãããæ§ç¯ãããŸãã ã»ããã¯ãTã§å®£èšãããŠãããã¹ãŠã®ã€ã³ãã¯ãµãŒããŸãã¯å®£èšããªãŒããŒã©ã€ããããçŸåšã®ã³ã³ããã¹ã (§7.4) ã§ã¢ã¯ã»ã¹ã§ããTã®åºæ¬åã§æ§æãããŸãã - 察å¿å¯èœã§ä»ã®ã€ã³ãã¯ãµãŒã«ãã£ãŠé衚瀺ã«ãããŠããªãã€ã³ãã¯ãµãŒã«ãã®ã»ããã¯çž®å°ãããŸãã æ¬¡ã®èŠåã¯ãã»ããå
ã®åã€ã³ãã¯ãµãŒ
S.Iã«é©çšãããŸããããã§ãSã¯ã€ã³ãã¯ãµãŒIã宣èšãããŠããåã§ãã-
IãA(§12.6.4.2) ã«å¯ŸããŠé©çšã§ããªãå ŽåãIã¯ã»ããããåé€ãããŸãã -
I(A) ã«å¯Ÿã㊠ãé©çšãããå Žåãåºæ¬åã®Sã§å®£èšãããŠãããã¹ãŠã®ã€ã³ãã¯ãµãŒãã»ããããåé€ãããŸãã -
I(A)ã«å¯Ÿã㊠ãé©çšãããSãobject以å€ã®ã¯ã©ã¹åã§ããå Žåãã€ã³ã¿ãŒãã§ã€ã¹ã§å®£èšãããŠãããã¹ãŠã®ã€ã³ãã¯ãµãŒãã»ããããåé€ãããŸãã
-
- çµæã®åè£ã€ã³ãã¯ãµãŒã®ã»ããã空ã®å Žåãé©çšå¯èœãªã€ã³ãã¯ãµãŒã¯ååšããããã€ã³ãæãšã©ãŒãçºçããŸãã
- åè£ã€ã³ãã¯ãµãŒã®ã»ããã®æé©ãªã€ã³ãã¯ãµãŒã¯ã §12.6.4ã®ãªãŒããŒããŒã解決èŠå 䜿çšããŠèå¥ãããŸãã 1 ã€ã®æé©ãªã€ã³ãã¯ãµãŒãèå¥ã§ããªãå Žåãã€ã³ãã¯ãµãŒã®ã¢ã¯ã»ã¹ããããŸãã«ãªãããã€ã³ãæãšã©ãŒãçºçããŸãã
- æé©ãªã€ã³ãã¯ãµãŒã®ã¢ã¯ã»ãµãŒããã§ãã¯ãããŸãã
- ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ãå²ãåœãŠã®ã¿ãŒã²ããã§ããå Žåãã€ã³ãã¯ãµãŒã¯ set ãŸã㯠ref get ã¢ã¯ã»ãµãŒãæã€å¿ èŠããããŸãããã以å€ã®å Žåã¯ããã€ã³ãæãšã©ãŒãçºçããŸãã
- ãã以å€ã®å Žåãã€ã³ãã¯ãµãŒã¯ get ãŸã㯠ref get ã¢ã¯ã»ãµãŒãæã€å¿ èŠããããŸãããã以å€ã®å Žåã¯ããã€ã³ãæãšã©ãŒãçºçããŸãã
ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã®çµæã¯ã次ã®ããã«åé¡ãããŸãã
- ã€ã³ãã¯ãµãŒã« ref get ã¢ã¯ã»ãµãŒãããå Žåãçµæã¯ã€ã³ãã¯ãµãŒåã®åãé¢é£ä»ãããã倿°ã«ãªããŸãã
- ãã以å€ã®å Žåãçµæã¯ã€ã³ãã¯ãµãŒåã®é¢é£ä»ããããåãæã€å€ã«ãªããŸãã
Tãã¯ã©ã¹åã®å Žåãé¢é£ä»ããããŠããåã¯ãTã§éå§ããåºåºã¯ã©ã¹ãæ€çŽ¢ãããšãã«èŠã€ãã£ãã€ã³ãã¯ãµãŒã®æåã®å®£èšãŸãã¯ãªãŒããŒã©ã€ãããéžæãããŸãã
Tãã€ã³ã¿ãŒãã§ã€ã¹åã®å Žåãé¢é£ä»ããããåã¯ãTããã³ãã®çŽæ¥ãŸãã¯éæ¥çãªåºæ¬ã€ã³ã¿ãŒãã§ã€ã¹ã®äžãããæãå
·äœç㪠(§19.4.10) ã€ã³ã¿ãŒãã§ã€ã¹ã«ããã€ã³ãã¯ãµãŒã®å®£èšãŸãã¯ãªãŒããŒã©ã€ãããéžæãããŸãã ãã®ãããªäžæã®åãååšããªãå Žåã¯ãã³ã³ãã€ã«æãšã©ãŒã§ãã
ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã®ã©ã³ã¿ã€ã åŠçã¯ãæ¬¡ã®æé ã§æ§æãããŸãã
- ã¿ãŒã²ãã primary_expression
Pãè©äŸ¡ãããŸãã -
argument_list
Aã®ã€ã³ããã¯ã¹åŒã¯ãå·Šããå³ã®é ã«è©äŸ¡ãããŸãã - ãã€ã³ãã£ã³ã°æã«æ±ºå®ãããæé©ãªã€ã³ãã¯ãµãŒã®äœ¿çš:
- ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ãå²ãåœãŠã®ã¿ãŒã²ããã§ããå Žåã¯ãset ã¢ã¯ã»ãµãŒãŸã㯠ref get ã¢ã¯ã»ãµãŒãåŒã³åºãããæ°ããå€ (§12.24.2) ãå²ãåœãŠãããŸãã
- ãã以å€ã®å Žåã¯ãget ã¢ã¯ã»ãµãŒãŸã㯠ref get ã¢ã¯ã»ãµãŒãåŒã³åºãããçŸåšã®å€ (§12.2.2) ãååŸãããŸãã
12.8.13 Null æ¡ä»¶ä»ãèŠçŽ ã¢ã¯ã»ã¹
null_conditional_element_accessã¯primary_expressionã®åŸã«2ã€ã®ããŒã¯ã³ "?" ãš "[" ãç¶ãããã®åŸã«argument_listãããã«"]" ããŒã¯ã³ãç¶ããŸãããããŠã0å以äžã®dependent_accessãç¶ãããã®ããããnull_forgiving_operatorãä»ããããããšããããŸãã
null_conditional_element_access
: primary_expression '?' '[' argument_list ']'
(null_forgiving_operator? dependent_access)*
;
null_conditional_element_accessã®argument_listã«ã¯ãoutãŸãã¯refåŒæ°ã¯å«ãŸããŸããã
null_conditional_element_accessã®primary_expressionã¯ãarray_initializerãå«ãŸãªãéããarray_creation_expressionã«ã¯ãªããŸããããŸããstackalloc_initializerãå«ãŸãªãéããstackalloc_expressionã«ããªããŸããã
泚: ãã®å¶éã¯ãæ··ä¹±ãæãå¯èœæ§ã®ããã³ãŒããçŠæ¢ããããã«ååšããŸãã é€å€å¯Ÿè±¡ã®äŸãèŠã€ãã element_access (§12.8.12) ã«ãåæ§ã®å¶éãé©çšãããŸãã æ³šé
null_conditional_element_access ã¯ã element_access (§12.8.7) ã®æ¡ä»¶ä»ãããŒãžã§ã³ã§ãããçµæã®åã voidã§ããå Žåã¯ãã€ã³ãã£ã³ã°æéãšã©ãŒã§ãã çµæã®åã void ã§ããå¯èœæ§ããã null æ¡ä»¶åŒã«ã€ããŠã¯ã(§12.8.11)ãåç
§ããŠãã ããã
null_conditional_element_access åŒ E 㯠P?[A]B 圢åŒã§ãB ã¯ãdependent_access ã«ãªããŸã (該åœããå Žå)ã
E ã®æå³ã¯æ¬¡ã®ããã«æ±ºå®ãããŸãã
Pã®åã null 蚱容å€åã®å Žå:åŒ
Tã®åãšããŠP.Value[A]Bãå®çŸ©ããŸããããTãåç §åãŸã㯠null é蚱容å€åã®ãããã§ããªãåãã©ã¡ãŒã¿ãŒã§ããå Žåãã³ã³ãã€ã«æãšã©ãŒãçºçããŸããTã null é蚱容å€åã®å ŽåãEã®åã¯T?ãããEã®æå³ã¯æ¬¡ã®æå³ãšåãã§ãã((object)P == null) ? (T?)null : P.Value[A]Bãã ãã
Pãè©äŸ¡ãããã®ã¯ 1 åã ãã§ãããã以å€ã®å Žåã
Eã®åã¯TãšãªããEã®æå³ã¯æ¬¡ã®æå³ãšåãã«ãªããŸãã((object)P == null) ? null : P.Value[A]Bãã ãã
Pãè©äŸ¡ãããã®ã¯ 1 åã ãã§ãã
ãã以å€ã®å Žå:
åŒ
Tã®åãšããŠP[A]Bãå®çŸ©ããŸããããTãåç §åãŸã㯠null é蚱容å€åã®ãããã§ããªãåãã©ã¡ãŒã¿ãŒã§ããå Žåãã³ã³ãã€ã«æãšã©ãŒãçºçããŸããTã null é蚱容å€åã®å ŽåãEã®åã¯T?ãããEã®æå³ã¯æ¬¡ã®æå³ãšåãã§ãã((object)P == null) ? (T?)null : P[A]Bãã ãã
Pãè©äŸ¡ãããã®ã¯ 1 åã ãã§ãããã以å€ã®å Žåã
Eã®åã¯TãšãªããEã®æå³ã¯æ¬¡ã®æå³ãšåãã«ãªããŸãã((object)P == null) ? null : P[A]Bãã ãã
Pãè©äŸ¡ãããã®ã¯ 1 åã ãã§ãã
泚æ: 次ã®åœ¢åŒã®åŒã«ãããŠ:
P?[Aâ]?[Aâ]
Pãnullã«è©äŸ¡ãããå ŽåãAâãAâãè©äŸ¡ãããŸããã åŒãnull_conditional_element_accessãŸãã¯null_conditional_member_access§12.8.8ã®æäœãå«ãäžé£ã®ãã®ã§ããå Žåãåæ§ã§ããæ³šé
12.8.14 ãã®ã¢ã¯ã»ã¹
this_access ã¯ããŒã¯ãŒã thisã§æ§æãããŸãã
this_access
: 'this'
;
this_access ã¯ãã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒãã€ã³ã¹ã¿ã³ã¹ ã¡ãœãããã€ã³ã¹ã¿ã³ã¹ ã¢ã¯ã»ãµãŒ (§12.2.1)ããŸãã¯ãã¡ã€ãã©ã€ã¶ãŒã® ããã㯠ã§ã®ã¿èš±å¯ãããŸãã æ¬¡ã®ããããã®æå³ããããŸãã
- ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒå
ã®
thisã§ ã䜿çšãããšãå€ãšããŠåé¡ãããŸãã å€ã®åã¯ãäœ¿çšæ³ãçºçããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹å (§15.3.2) ã§ãããå€ã¯æ§ç¯ããããªããžã§ã¯ããžã®åç §ã§ãã - ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ ã¡ãœãããŸãã¯ã€ã³ã¹ã¿ã³ã¹ ã¢ã¯ã»ãµãŒå
ã®
thisã§ ã䜿çšãããšãå€ãšããŠåé¡ãããŸãã å€ã®åã¯ãäœ¿çšæ³ãçºçããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹å (§15.3.2) ã§ãããå€ã¯ã¡ãœãããŸãã¯ã¢ã¯ã»ãµãŒãåŒã³åºããããªããžã§ã¯ããžã®åç §ã§ãã - æ§é äœã®ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒå
ã®
thisã§ ã䜿çšãããšã倿°ãšããŠåé¡ãããŸãã 倿°ã®åã¯ã䜿çšãè¡ãããæ§é äœã®ã€ã³ã¹ã¿ã³ã¹å (§15.3.2) ã§ããã倿°ã¯æ§ç¯ãããæ§é äœã衚ããŸãã- ã³ã³ã¹ãã©ã¯ã¿ãŒå®£èšã«ã³ã³ã¹ãã©ã¯ã¿ãŒåæååããªãå Žåã
this倿°ã¯æ§é äœåã®åºåãã©ã¡ãŒã¿ãŒãšåæ§ã«åäœããŸãããæç¢ºãªä»£å ¥èŠä»¶ (§9.4.1) ãæºããããŠããªãå Žåã¯ãšã©ãŒã«ãªããªãç¹ãç°ãªããŸãã 代ããã«ã次ã®åŠçãè¡ãããŸãã-
this倿°èªäœãèŠä»¶ãæºãããŠããªãå Žåãã³ã³ã¹ãã©ã¯ã¿ãŒå ã®ä»ã®ã³ãŒããå®è¡ãããåã«ãèŠä»¶ã«éåãããã¹ãŠã®æç¹ã§ãthiså ã®ãã¹ãŠã®æªå²ãåœãŠã€ã³ã¹ã¿ã³ã¹å€æ°ãåæåãã§ãŒãºã§æ¢å®å€ (§9.3) ã«æé»çã«åæåãããŸãã -
å
ã®ã€ã³ã¹ã¿ã³ã¹å€æ°
thisãèŠä»¶ãæºãããŠããªãå ŽåããŸã㯠v å ã®ä»»æã®ã¬ãã«ã®å ¥ãåã®ã€ã³ã¹ã¿ã³ã¹å€æ°ãèŠä»¶ãæºãããŠããªãå Žåãv ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒå ã®ä»ã®ã³ãŒããå®è¡ãããåã«ãåæåãã§ãŒãºã§æé»çã«æ¢å®å€ã«åæåãããŸãã
-
- ãã以å€ã®å Žåã
this倿°ã¯æ§é äœåã®refãã©ã¡ãŒã¿ãŒãšãŸã£ããåãããã«åäœããŸãã ç¹ã«ãããã¯å€æ°ãæåã«å²ãåœãŠããããšèŠãªãããããšãæå³ããŸãã
- ã³ã³ã¹ãã©ã¯ã¿ãŒå®£èšã«ã³ã³ã¹ãã©ã¯ã¿ãŒåæååããªãå Žåã
- æ§é äœã®ã€ã³ã¹ã¿ã³ã¹ ã¡ãœãããŸãã¯ã€ã³ã¹ã¿ã³ã¹ ã¢ã¯ã»ãµãŒå
ã®
thisã§ ã䜿çšãããšã倿°ãšããŠåé¡ãããŸãã 倿°ã®åã¯ã䜿çšãè¡ãããæ§é äœã®ã€ã³ã¹ã¿ã³ã¹å (§15.3.2) ã§ãã- ã¡ãœãããŸãã¯ã¢ã¯ã»ãµãŒãå埩å (§15.15) ãŸãã¯éåæé¢æ° (§15.14) ã§ãªãå Žåã
this倿°ã¯ã¡ãœãããŸãã¯ã¢ã¯ã»ãµãŒãåŒã³åºãããæ§é äœã衚ããŸãã- æ§é äœã
readonly structã®å Žåãthis倿°ã¯æ§é äœåã®å ¥åãã©ã¡ãŒã¿ãŒãšãŸã£ããåãããã«åäœããŸã - ãã以å€ã®å Žåã
this倿°ã¯æ§é äœåã®refãã©ã¡ãŒã¿ãŒãšãŸã£ããåãããã«åäœããŸãã
- æ§é äœã
- ã¡ãœãããŸãã¯ã¢ã¯ã»ãµãŒãå埩åãŸãã¯éåæé¢æ°ã®å Žåã
this倿°ã¯ãã¡ãœãããŸãã¯ã¢ã¯ã»ãµãŒãåŒã³åºãããæ§é äœã® ã³ã㌠ã衚ããæ§é äœåã® å€ ãã©ã¡ãŒã¿ãŒãšãŸã£ããåãããã«åäœããŸãã
- ã¡ãœãããŸãã¯ã¢ã¯ã»ãµãŒãå埩å (§15.15) ãŸãã¯éåæé¢æ° (§15.14) ã§ãªãå Žåã
äžèšã®ã³ã³ããã¹ã以å€ã®ã³ã³ããã¹ãã§ this ã§ ã䜿çšãããšãã³ã³ãã€ã«æãšã©ãŒã«ãªããŸãã ç¹ã«ãéçã¡ãœãããéçãããã㣠ã¢ã¯ã»ãµãŒããŸãã¯ãã£ãŒã«ã宣èšã® this ã§ ãåç
§ããããšã¯ã§ããŸããã
12.8.15 ããŒã¹ ã¢ã¯ã»ã¹
base_access ã¯ããbaseãããŒã¯ã³ãŸãã¯èå¥åã®ãããããç¶ãããŒã¯ãŒã . ã§æ§æããããªãã·ã§ã³ã® type_argument_list ãŸã㯠argument_list ã¯ãè§ãã£ãã§å²ãŸããŸãã
base_access
: 'base' '.' identifier type_argument_list?
| 'base' '[' argument_list ']'
;
base_access ã¯ãçŸåšã®ã¯ã©ã¹ãŸãã¯æ§é äœã®åæ§ã®ååä»ãã¡ã³ããŒã«ãã£ãŠé衚瀺ã«ãªã£ãŠããåºåºã¯ã©ã¹ã®ã¡ã³ããŒã«ã¢ã¯ã»ã¹ããããã«äœ¿çšãããŸãã
base_access ã¯ãã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒãã€ã³ã¹ã¿ã³ã¹ ã¡ãœãããã€ã³ã¹ã¿ã³ã¹ ã¢ã¯ã»ãµãŒ (§12.2.1)ããŸãã¯ãã¡ã€ãã©ã€ã¶ãŒã®æ¬äœã§ã®ã¿èš±å¯ãããŸãã ã¯ã©ã¹ãŸãã¯æ§é äœã§ base.I ãçºçããå ŽåãI ã¯ãã®ã¯ã©ã¹ãŸãã¯æ§é äœã®åºåºã¯ã©ã¹ã®ã¡ã³ããŒã衚ãå¿
èŠããããŸãã åæ§ã«ãã¯ã©ã¹ã§ base[E] ãçºçããå Žåãé©çšå¯èœãªã€ã³ãã¯ãµãŒãåºåºã¯ã©ã¹ã«ååšããå¿
èŠããããŸãã
ãã€ã³ãæã«ããã©ãŒã ãš base.I ã® base[E] åŒã¯ã ((B)this).I ãš ((B)this)[E]ãèšè¿°ãããå ŽåãšãŸã£ããåãããã«è©äŸ¡ãããŸããããã§ã B ã¯ã³ã³ã¹ãã©ã¯ããçºçããã¯ã©ã¹ãŸãã¯æ§é äœã®åºåºã¯ã©ã¹ã§ãã ãããã£ãŠã base.I ãš base[E] 㯠this.I ãš this[E]ã«å¯Ÿå¿ããŸãããã ãã this ã¯åºåºã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãšèŠãªãããŸãã
base_access ãä»®æ³é¢æ°ã¡ã³ã㌠(ã¡ãœãããããããã£ããŸãã¯ã€ã³ãã¯ãµãŒ) ãåç
§ãããšãå®è¡æã«åŒã³åºã颿°ã¡ã³ã㌠(§12.6.6) ã®æ±ºå®ã倿ŽãããŸãã åŒã³åºããã颿°ã¡ã³ããŒã¯ã ã«é¢ããŠé¢æ°ã¡ã³ããŒã®æã掟çããå®è£
(B) ãèŠã€ããããšã«ãã£ãŠæ±ºå®ãããŸã (thisã®å®è¡æã®åã«é¢ããŠã¯ãéåºæ¬ã¢ã¯ã»ã¹ã®å Žåãšåæ§)ã ãããã£ãŠãä»®æ³é¢æ°ã¡ã³ããŒã®ãªãŒããŒã©ã€ãå
ã§ã base_access ã䜿çšããŠã颿°ã¡ã³ããŒã®ç¶æ¿ãããå®è£
ãåŒã³åºãããšãã§ããŸãã
base_access ã«ãã£ãŠåç
§ããã颿°ã¡ã³ããŒãæœè±¡ã§ããå Žåã¯ããã€ã³ãæãšã©ãŒãçºçããŸãã
泚æ:
thisãšã¯ç°ãªããbaseèªäœã¯åŒã§ã¯ãããŸããã ããã¯ã base_access ãŸã㯠constructor_initializer (§15.11.2) ã®ã³ã³ããã¹ãã§ã®ã¿äœ¿çšãããããŒã¯ãŒãã§ãã æ³šé
12.8.16 åŸçœ®ã€ã³ã¯ãªã¡ã³ãæŒç®åãšåŸçœ®ãã¯ãªã¡ã³ãæŒç®å
post_increment_expression
: primary_expression '++'
;
post_decrement_expression
: primary_expression '--'
;
åŸçœ®ã€ã³ã¯ãªã¡ã³ããŸãã¯ãã¯ãªã¡ã³ãæŒç®ã®ãªãã©ã³ãã¯ã倿°ããããã㣠ã¢ã¯ã»ã¹ããŸãã¯ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ãšããŠåé¡ãããåŒã§ãªããã°ãªããŸããã æŒç®ã®çµæã¯ãªãã©ã³ããšåãåã®å€ã«ãªããŸãã
primary_expression ãã³ã³ãã€ã«æã®å dynamic ãæã€å ŽåãæŒç®åã¯åçã«ãã€ã³ããã (§12.3.3)ããpost_increment_expression ãŸã㯠post_decrement_expression ã¯ã³ã³ãã€ã«æã®å dynamic ãæã¡ããprimary_expression ã®å®è¡æã®åã䜿çšããŠå®è¡æã«æ¬¡ã®èŠåãé©çšãããŸãã
åŸçœ®ã€ã³ã¯ãªã¡ã³ããŸãã¯ãã¯ãªã¡ã³ãæŒç®ã®ãªãã©ã³ããããããã£ãŸãã¯ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã§ããå Žåãããããã£ãŸãã¯ã€ã³ãã¯ãµãŒã«ã¯ãget ã¢ã¯ã»ãµãŒãš set ã¢ã¯ã»ãµãŒãŸã㯠init ã¢ã¯ã»ãµãŒã®äž¡æ¹ãå«ãŸããŸãã ããã§ãªãå Žåã¯ããã€ã³ãæãšã©ãŒãçºçããŸãã
åé
æŒç®åã®ãªãŒããŒããŒã解決(§12.4.4)ã¯ãç¹å®ã®æŒç®åã®å®è£
ãéžæããããã«é©çšãããŸãã å®çŸ©æžã¿ã® ++ æŒç®åãš -- æŒç®åã¯ã sbyteã byteã shortã ushortã intã uintã nintã nuintã longã ulongã charã floatdoubleã decimalãä»»æã®åæåã«å¯ŸããŠååšããŸãã å®çŸ©æžã¿ã® ++ æŒç®åã¯ããªãã©ã³ãã« 1 ã远å ããããšã«ãã£ãŠçæãããå€ãè¿ããå®çŸ©æžã¿ã® -- æŒç®åã¯ããªãã©ã³ããã 1 ãæžç®ããããšã«ãã£ãŠçæãããå€ãè¿ããŸãã ãã§ãã¯ãããã³ã³ããã¹ãã§ã¯ããã®å ç®ãŸãã¯æžç®ã®çµæãçµæåã®ç¯å²å€ã§ãçµæã®åãæŽæ°åãŸãã¯åæåã®å Žåã System.OverflowException ãã¹ããŒãããŸãã
éžæããåé æŒç®åã®æ»ãå€ã®åãã primary_expressionã®åãžã®æé»çãªå€æãå¿ èŠã§ãããã以å€ã®å Žåã¯ãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
ãã©ãŒã x++ ãŸã㯠x-- ã®åŸçœ®ã€ã³ã¯ãªã¡ã³ããŸãã¯ãã¯ãªã¡ã³ãæŒç®ã®å®è¡æåŠçã¯ãæ¬¡ã®æé ã§æ§æãããŸãã
-
xã倿°ãšããŠåé¡ãããå Žå:-
xã¯ã倿°ãçæããããã«è©äŸ¡ãããŸãã -
xã®å€ãä¿åãããŸãã -
xã®ä¿åãããå€ã¯ãéžæããæŒç®åã®ãªãã©ã³ãåã«å€æããããã®å€ãåŒæ°ãšããŠäœ¿çšããŠæŒç®åãåŒã³åºãããŸãã - æŒç®åã«ãã£ãŠè¿ãããå€ã¯ã
xã®åã«å€æãããxã®ä»¥åã®è©äŸ¡ã«ãã£ãŠæå®ãããå Žæã«æ ŒçŽãããŸãã -
xã®ä¿åãããå€ãæŒç®ã®çµæã«ãªããŸãã
-
-
xãããããã£ãŸãã¯ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ãšããŠåé¡ãããå Žå:- ã€ã³ã¹ã¿ã³ã¹åŒ (
xãstaticãããŠããªãå Žå) ãšãxã«é¢é£ä»ããããŠããåŒæ°ãªã¹ã (xãã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã®å Žå) ãè©äŸ¡ããããã®çµæã¯åŸç¶ã® get ããã³ set ãŸã㯠init ã¢ã¯ã»ãµãŒåŒã³åºãã§äœ¿çšãããŸãã -
xã® get ã¢ã¯ã»ãµãŒãåŒã³åºãããæ»ãå€ãä¿åãããŸãã -
xã®ä¿åãããå€ã¯ãéžæããæŒç®åã®ãªãã©ã³ãåã«å€æããããã®å€ãåŒæ°ãšããŠäœ¿çšããŠæŒç®åãåŒã³åºãããŸãã - æŒç®åã«ãã£ãŠè¿ãããå€ã¯
xã®åã«å€æãããxã® set ã¢ã¯ã»ãµãŒãŸã㯠init ã¢ã¯ã»ãµãŒã¯ããã®å€åŒæ°ãšããŠãã®å€ã䜿çšããŠåŒã³åºãããŸãã -
xã®ä¿åãããå€ãæŒç®ã®çµæã«ãªããŸãã
- ã€ã³ã¹ã¿ã³ã¹åŒ (
++æŒç®åãš--æŒç®åã§ã¯ããã¬ãã£ãã¯ã¹è¡šèšããµããŒããããŠããŸã (§12.9.7)ã
x++ ãŸã㯠x-- ã®çµæã¯æŒç®x ã® ã®å€ã§ããã ++x ãŸã㯠--x ã®çµæã¯æŒç®x ã® ã®å€ã§ãã ã©ã¡ãã®å Žåãã x èªäœã¯æŒç®åŸã«åãå€ãæã¡ãŸãã
æŒç®å ++ ãŸãã¯æŒç®å -- å®è£
ã¯ãåŸçœ®è¡šèšãŸãã¯ãã¬ãã£ãã¯ã¹è¡šèšã䜿çšããŠåŒã³åºãããšãã§ããŸãã 2 ã€ã®è¡šèšã«å¯ŸããŠåå¥ã®æŒç®åãå®è£
ããããšã¯ã§ããŸããã
12.8.17 new æŒç®å
12.8.17.1 å šè¬
new æŒç®åã¯ãåã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããããã«äœ¿çšãããŸãã
æ°ããåŒã«ã¯ã次㮠3 ã€ã®åœ¢åŒããããŸãã
- ãªããžã§ã¯ãäœæåŒã¯ãã¯ã©ã¹åãšå€åã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããããã«äœ¿çšãããŸãã
- é åäœæåŒã¯ãé ååã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããããã«äœ¿çšãããŸãã
- ããªã²ãŒãäœæåŒã¯ãããªã²ãŒãåã®ã€ã³ã¹ã¿ã³ã¹ãååŸããããã«äœ¿çšãããŸãã
new æŒç®åã¯ãåã®ã€ã³ã¹ã¿ã³ã¹ã®äœæãæå³ããŸãããå¿
ãããã¡ã¢ãªã®å²ãåœãŠãæå³ããããã§ã¯ãããŸããã ç¹ã«ãå€åã®ã€ã³ã¹ã¿ã³ã¹ã§ã¯ãååšãã倿°ãè¶
ãã远å ã®ã¡ã¢ãªã¯å¿
èŠãããŸããããŸãã new ã䜿çšããŠå€åã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããšãã«å²ãåœãŠã¯è¡ãããŸããã
泚: ããªã²ãŒãäœæåŒã¯ãåžžã«æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæãããšã¯éããŸããã åŒãã¡ãœãã ã°ã«ãŒã倿 (§10.8) ãŸãã¯å¿å颿°å€æ (§10.7) ãšåãæ¹æ³ã§åŠçããããšãæ¢åã®ããªã²ãŒã ã€ã³ã¹ã¿ã³ã¹ãåå©çšãããå¯èœæ§ããããŸãã æ³šé
12.8.17.2 ãªããžã§ã¯ãäœæåŒ
12.8.17.2.1 å šè¬
object_creation_expression ã¯ã class_type ãŸã㯠value_typeã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããããã«äœ¿çšãããŸãã
object_creation_expression
: 'new' type '(' argument_list? ')' object_or_collection_initializer?
| 'new' type object_or_collection_initializer
| target_typed_new
;
target_typed_new
: 'new' '(' argument_list? ')' object_or_collection_initializer?
;
object_or_collection_initializer
: object_initializer
| collection_initializer
;
object_creation_expression ã® å ã¯ã class_typeã value_typeã ãŸã㯠type_parameterãšããŸãã å ã¯ã tuple_type ãŸãã¯æœè±¡ãŸãã¯éç㪠class_typeã«ããããšã¯ã§ããŸããã
䜿çšãã type æšè«ã§ããå Žåã¯ã target_typed_newã§èš±å¯ãããŠããããã«çç¥ã§ããŸãã åãæšè«ã§ããªãå Žåã type ãçç¥ããã®ã¯ã³ã³ãã€ã«æãšã©ãŒã§ãã
target_typed_newåŒã«ã¯åããããŸããã ãã ããtarget_typed_newåŒãããã¹ãŠã®åãžã®æé»çãªãªããžã§ã¯ãäœæå€æ (§10.2.19) ããããŸãã
target_typed_newãåé
æŒç®åãŸãã¯äºé
æŒç®åã®ãªãã©ã³ããšããŠäœ¿çšãããŠããå ŽåããŸãã¯ãªããžã§ã¯ãäœæå€æã®å¯Ÿè±¡ã§ã¯ãªãå Žåã¯ãã³ã³ãã€ã«æãšã©ãŒã§ãã
typeãååšããå Žåã¯ããã®åTããŸãããã以å€ã®å Žåã¯ãæé»çãªåTããŸãã
çç¥å¯èœãª argument_list (§12.6.2) ã¯ã å ã class_type ãŸã㯠struct_typeã§ããå Žåã«ã®ã¿èš±å¯ãããŸãã
ãªããžã§ã¯ãäœæåŒã¯ããªããžã§ã¯ãåæååãŸãã¯ã³ã¬ã¯ã·ã§ã³åæååãå«ãå Žåãã³ã³ã¹ãã©ã¯ã¿ãŒã®åŒæ°ãªã¹ãããã³æ¬åŒ§ãçç¥ã§ããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒåŒæ°ãªã¹ããçç¥ãããã£ããå²ãã®ã¯ã空ã®åŒæ°ãªã¹ããæå®ããããšãšåãã§ãã
ãªããžã§ã¯ãåæååãŸãã¯ã³ã¬ã¯ã·ã§ã³åæååãå«ããªããžã§ã¯ãäœæåŒã®åŠçã¯ãæåã«ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒãåŠçããŠããããªããžã§ã¯ãåæåå (§12.8.17.2.2) ãŸãã¯ã³ã¬ã¯ã·ã§ã³åæåå (§12.8.17.2.3) ã§æå®ãããã¡ã³ããŒãŸãã¯èŠçŽ ã®åæåãåŠçããŸãã
ãªãã·ã§ã³ã® argument_list ã®åŒæ°ã«ã³ã³ãã€ã«æã®å dynamic ãããå Žåãobject_creation_expression ã¯ãåçã«ãã€ã³ããã (§12.3.3)ãæ¬¡ã®èŠåããã³ã³ãã€ã«æã®å ããã dynamic ã®åŒæ°ã®ã©ã³ã¿ã€ã æã®åã䜿çšããŠã©ã³ã¿ã€ã æã«é©çšãããŸãã ãã ãããªããžã§ã¯ãã®äœæã§ã¯ã §12.6.5ã§èª¬æãããŠããããã«ãã³ã³ãã€ã«æã®ãã§ãã¯ãå¶éãããŸãã
ãã©ãŒã ã®ãã€ã³ãæåŠç (æå®ãããåãŸãã¯æé»çãªånew T(A)ãTãŸãã¯value_typeã§ãããã¯çç¥å¯èœãªA) ã¯ãæ¬¡ã®æé ã§æ§æãããŸãã
-
Tã value_type ã§ãAãååšããªãå Žå:-
Tããæç€ºçã«å®£èšããããã©ã¡ãŒã¿ãŒãªãã®ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒãæã€struct_typeã§ããå Žåããã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯åè£ãšãªããæ¬¡ã«èª¬æããããã«ãªãŒããŒããŒã解決ã«ãã£ãŠéžæãããŸãã - ãã以å€ã®å Žåã object_creation_expression ã¯æ¢å®ã®ã³ã³ã¹ãã©ã¯ã¿ãŒåŒã³åºãã§ãã
object_creation_expression ã®çµæã¯ãå
Tã®å€ãã€ãŸããTã§å®çŸ©ãããŠãã ã®æ¢å®å€ã§ãã
-
- ãã以å€ã®å Žåã
Tã type_parameter ã§ãAãååšããªãå Žå:-
ã«å€åå¶çŽãŸãã¯ã³ã³ã¹ãã©ã¯ã¿ãŒå¶çŽ (
T) ãæå®ãããŠããªãå Žåããã€ã³ãæãšã©ãŒãçºçããŸãã - object_creation_expression ã®çµæã¯ãåãã©ã¡ãŒã¿ãŒããã€ã³ããããŠããã©ã³ã¿ã€ã åã®å€ãã€ãŸãããã®åã®æ¢å®ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºããçµæã§ãã å®è¡æã®åã«ã¯ãåç §åãŸãã¯å€åãæå®ã§ããŸãã
-
ã«å€åå¶çŽãŸãã¯ã³ã³ã¹ãã©ã¯ã¿ãŒå¶çŽ (
- ãã以å€ã®å Žåã
Tã class_type ãŸã㯠struct_typeã®å Žå:-
Tãæœè±¡ãŸãã¯éç㪠class_typeã®å Žåã¯ãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã - åŒã³åºãã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ã §12.6.4ã®ãªãŒããŒããŒã解決èŠå 䜿çšããŠæ±ºå®ãããŸãã åè£ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã®ã»ããã¯ã
Tã§å®£èšãããŠãããã¹ãŠã®ã¢ã¯ã»ã¹å¯èœãªã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã§æ§æãããŸãããã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãA(§12.6.4.2) ã«é©çšãããŸãã åè£ã®ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã®ã»ããã空ã®å ŽåããŸã㯠1 ã€ã®æé©ãªã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒãèå¥ã§ããªãå Žåã¯ããã€ã³ãæãšã©ãŒãçºçããŸãã -
object_creation_expression ã®çµæã¯ã
Tåã®å€ãã€ãŸããäžèšã®æé ã§æ±ºå®ãããã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãããšã«ãã£ãŠçæãããå€ã§ãã - ãã以å€ã®å Žåã object_creation_expression ã¯ç¡å¹ã§ããããã€ã³ãæãšã©ãŒãçºçããŸãã
-
object_creation_expression ãåçã«ãã€ã³ããããŠããå Žåã§ããã³ã³ãã€ã«æã®å㯠Tã§ãã
æå®ãŸãã¯æé»çãªåã®ãŸãã¯struct_typeã§ãnew T(A)ãçç¥å¯èœãªargument_listã§ãããã©ãŒã Tã®ã®å®è¡æåŠçã¯ãæ¬¡ã®æé ã§æ§æãããŸãAã
-
Tã class_typeã®å Žå:- ã¯ã©ã¹
Tã®æ°ããã€ã³ã¹ã¿ã³ã¹ãå²ãåœãŠãããŸãã æ°ããã€ã³ã¹ã¿ã³ã¹ãå²ãåœãŠãã®ã«ååãªã¡ã¢ãªããªãå Žåã¯ãSystem.OutOfMemoryExceptionãã¹ããŒããããã以äžã®æé ã¯å®è¡ãããŸããã - æ°ããã€ã³ã¹ã¿ã³ã¹ã®ãã¹ãŠã®ãã£ãŒã«ãã¯ãæ¢å®å€ (§9.3) ã«åæåãããŸãã
- ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ã颿°ã¡ã³ããŒåŒã³åºã (§12.6.6) ã®èŠåã«åŸã£ãŠåŒã³åºãããŸãã æ°ããå²ãåœãŠãããã€ã³ã¹ã¿ã³ã¹ãžã®åç §ãã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã«èªåçã«æž¡ããããã®ã³ã³ã¹ãã©ã¯ã¿ãŒå ããã€ã³ã¹ã¿ã³ã¹ã«ã¢ã¯ã»ã¹ã§ããŸãã
- ã¯ã©ã¹
-
Tã struct_typeã®å Žå:-
Tåã®ã€ã³ã¹ã¿ã³ã¹ã¯ãäžæããŒã«ã«å€æ°ãå²ãåœãŠãããšã«ãã£ãŠäœæãããŸãã struct_type ã®ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãäœæããã€ã³ã¹ã¿ã³ã¹ã®åãã£ãŒã«ãã«å€ã確å®ã«å²ãåœãŠãå¿ èŠããããããäžæå€æ°ã®åæåã¯å¿ èŠãããŸããã - ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ã颿°ã¡ã³ããŒåŒã³åºã (§12.6.6) ã®èŠåã«åŸã£ãŠåŒã³åºãããŸãã æ°ããå²ãåœãŠãããã€ã³ã¹ã¿ã³ã¹ãžã®åç §ãã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã«èªåçã«æž¡ããããã®ã³ã³ã¹ãã©ã¯ã¿ãŒå ããã€ã³ã¹ã¿ã³ã¹ã«ã¢ã¯ã»ã¹ã§ããŸãã
-
12.8.17.2.2 ãªããžã§ã¯ãåæåå
ãªããžã§ã¯ãåæåå ã¯ããªããžã§ã¯ãã® 0 å以äžã®ãã£ãŒã«ããããããã£ããŸãã¯ã€ã³ããã¯ã¹ä»ãèŠçŽ ã®å€ãæå®ããŸãã
object_initializer
: '{' member_initializer_list? '}'
| '{' member_initializer_list ',' '}'
;
member_initializer_list
: member_initializer (',' member_initializer)*
;
member_initializer
: initializer_target '=' 'ref'? initializer_value
;
initializer_target
: identifier
| '[' argument_list ']'
;
initializer_value
: 'ref'? expression
| object_or_collection_initializer
;
ãªããžã§ã¯ãåæååã¯ãã¡ã³ããŒåæååã®ã·ãŒã±ã³ã¹ã§æ§æããã { ããŒã¯ã³ãš } ããŒã¯ã³ã§å²ã¿ãã³ã³ãã§åºåãããŸãã å member_initializer ã¯ãåæåã®ã¿ãŒã²ãããæå®ããå¿
èŠããããŸãã
èå¥å ã¯ãåæåãããªããžã§ã¯ãã®ã¢ã¯ã»ã¹å¯èœãªãã£ãŒã«ããŸãã¯ããããã£ã«ååãä»ããŸãããè§ãã£ãã§å²ãŸãã argument_list ã¯ãåæåãããªããžã§ã¯ãã®ã¢ã¯ã»ã¹å¯èœãªã€ã³ãã¯ãµãŒã®åŒæ°ãæå®ããå¿
èŠããããŸãã ãªããžã§ã¯ãåæååãåããã£ãŒã«ããŸãã¯ããããã£ã«å¯ŸããŠè€æ°ã®ã¡ã³ããŒåæååãå«ããã®ã¯ãšã©ãŒã§ãã
泚: ãªããžã§ã¯ãåæååã¯ãåããã£ãŒã«ããŸãã¯ããããã£ãè€æ°åèšå®ããããšã¯èš±å¯ãããŠããŸããããã€ã³ãã¯ãµãŒã«ã¯ãã®ãããªå¶éã¯ãããŸããã ãªããžã§ã¯ãåæååã«ã¯ãã€ã³ãã¯ãµãŒãåç §ããè€æ°ã®åæååã¿ãŒã²ãããå«ããåãã€ã³ãã¯ãµãŒåŒæ°ãè€æ°å䜿çšããããšãã§ããŸãã æ³šé
å initializer_target ã®åŸã«çå·ãšãåŒããªããžã§ã¯ãåæååããŸãã¯ã³ã¬ã¯ã·ã§ã³åæååãç¶ããŸãã ãªããžã§ã¯ãåæååå ã®åŒã§ãåæåäžã®æ°ããäœæããããªããžã§ã¯ããåç §ããããšã¯ã§ããŸããã
initializer_targetã®argument_listã§ã¯ãRangeå (§18.4.3) ã®åŒæ°ã¯æé»çã«ãµããŒããããŸããã
çå·ã®åŸã«åŒãæå®ããã¡ã³ããŒåæååã¯ãã¿ãŒã²ãããžã®ä»£å ¥ (§12.24.2) ãšåãæ¹æ³ã§åŠçãããŸãã
çå·ã®åŸã«ãªããžã§ã¯ãåæååãæå®ããã¡ã³ããŒåæååã¯ã å ¥ãåã«ãªã£ããªããžã§ã¯ãåæååã§ããã€ãŸããåã蟌ã¿ãªããžã§ã¯ãã®åæåã§ãã ãã£ãŒã«ããŸãã¯ããããã£ã«æ°ããå€ãå²ãåœãŠã代ããã«ãå ¥ãåã«ãªã£ããªããžã§ã¯ãåæååã®å²ãåœãŠã¯ããã£ãŒã«ããŸãã¯ããããã£ã®ã¡ã³ããŒãžã®å²ãåœãŠãšããŠæ±ãããŸãã å ¥ãåã«ãªã£ããªããžã§ã¯ãåæååã¯ãå€åã®ããããã£ããå€åãæã€èªã¿åãå°çšãã£ãŒã«ãã«ã¯é©çšã§ããŸããã
çå·ã®åŸã«ã³ã¬ã¯ã·ã§ã³åæååãæå®ããã¡ã³ããŒåæååã¯ãåã蟌ã¿ã³ã¬ã¯ã·ã§ã³ã®åæåã§ãã ã¿ãŒã²ãã ãã£ãŒã«ããããããã£ããŸãã¯ã€ã³ãã¯ãµãŒã«æ°ããã³ã¬ã¯ã·ã§ã³ãå²ãåœãŠã代ããã«ãåæååã§æå®ãããèŠçŽ ãã¿ãŒã²ããã«ãã£ãŠåç §ãããã³ã¬ã¯ã·ã§ã³ã«è¿œå ãããŸãã ã¿ãŒã²ããã¯ã §12.8.17.2.3 ã§æå®ãããèŠä»¶ãæºããã³ã¬ã¯ã·ã§ã³åã§ããå¿ èŠããããŸãã
åæååã¿ãŒã²ãããã€ã³ãã¯ãµãŒãåç §ããå Žåãã€ã³ãã¯ãµãŒã®åŒæ°ã¯åžžã« 1 åã ãè©äŸ¡ãããŸãã ãããã£ãŠãåŒæ°ã䜿çšãããŠããªããŠã (ããšãã°ããã¹ããããåæååã空ã®ãã)ã坿¬¡ç圱é¿ãè©äŸ¡ãããŸãã
äŸ: 次ã®ã¯ã©ã¹ã¯ã2 ã€ã®åº§æšãæã€ç¹ã衚ããŸãã
public class Point { public int X { get; set; } public int Y { get; set; } }
Pointã®ã€ã³ã¹ã¿ã³ã¹ã¯ã次ã®ããã«äœæããã³åæåã§ããŸããPoint a = new Point { X = 0, Y = 1 };广ã¯ä»¥äžãšåãã§ã
Point __a = new Point(); __a.X = 0; __a.Y = 1; Point a = __a;ããã§ã
__aã¯ãã以å€ã®å Žåã¯é衚瀺ã§ã¢ã¯ã»ã¹ã§ããªãäžæå€æ°ã§ããæ¬¡ã®ã¯ã©ã¹ã¯ã2 ã€ã®ãã€ã³ãããäœæãããåè§åœ¢ãšã
Rectangleã€ã³ã¹ã¿ã³ã¹ã®äœæãšåæåã瀺ããŠããŸããpublic class Rectangle { public Point P1 { get; set; } public Point P2 { get; set; } }
Rectangleã®ã€ã³ã¹ã¿ã³ã¹ã¯ã次ã®ããã«äœæããã³åæåã§ããŸããRectangle r = new Rectangle { P1 = new Point { X = 0, Y = 1 }, P2 = new Point { X = 2, Y = 3 } };广ã¯ä»¥äžãšåãã§ã
Rectangle __r = new Rectangle(); Point __p1 = new Point(); __p1.X = 0; __p1.Y = 1; __r.P1 = __p1; Point __p2 = new Point(); __p2.X = 2; __p2.Y = 3; __r.P2 = __p2; Rectangle r = __r;ããã§ã
__rã__p1ããã³__p2ã¯ããã以å€ã®å Žåã¯é衚瀺ã§ã¢ã¯ã»ã¹ã§ããªãäžæçãªå€æ°ã§ãã
Rectangleã®ã³ã³ã¹ãã©ã¯ã¿ãŒã 2 ã€ã®åã蟌ã¿Pointã€ã³ã¹ã¿ã³ã¹ãå²ãåœãŠãå Žåã¯ãæ°ããã€ã³ã¹ã¿ã³ã¹ãå²ãåœãŠãã®ã§ã¯ãªããåã蟌ã¿Pointã€ã³ã¹ã¿ã³ã¹ãåæåããããã«äœ¿çšã§ããŸããpublic class Rectangle { public Point P1 { get; } = new Point(); public Point P2 { get; } = new Point(); }次ã®ã³ã³ã¹ãã©ã¯ãã䜿çšããŠãæ°ããã€ã³ã¹ã¿ã³ã¹ãå²ãåœãŠã代ããã«ãåã蟌ã¿
Pointã€ã³ã¹ã¿ã³ã¹ãåæåã§ããŸããRectangle r = new Rectangle { P1 = { X = 0, Y = 1 }, P2 = { X = 2, Y = 3 } };广ã¯ä»¥äžãšåãã§ã
Rectangle __r = new Rectangle(); __r.P1.X = 0; __r.P1.Y = 1; __r.P2.X = 2; __r.P2.Y = 3; Rectangle r = __r;çµäºãµã³ãã«
12.8.17.2.3 ã³ã¬ã¯ã·ã§ã³åæåå
ã³ã¬ã¯ã·ã§ã³åæååã¯ãã³ã¬ã¯ã·ã§ã³ã®èŠçŽ ãæå®ããŸãã
collection_initializer
: '{' element_initializer_list '}'
| '{' element_initializer_list ',' '}'
;
element_initializer_list
: element_initializer (',' element_initializer)*
;
element_initializer
: non_assignment_expression
| '{' expression_list '}'
;
expression_list
: expression (',' expression)*
;
ã³ã¬ã¯ã·ã§ã³åæååã¯ãèŠçŽ åæååã®ã·ãŒã±ã³ã¹ã§æ§æããã { ããŒã¯ã³ãš } ããŒã¯ã³ã§å²ã¿ãã³ã³ãã§åºåãããŸãã åèŠçŽ åæååã¯ãåæåããã³ã¬ã¯ã·ã§ã³ ãªããžã§ã¯ãã«è¿œå ããèŠçŽ ãæå®ãã { ããŒã¯ã³ãš } ããŒã¯ã³ã§å²ãŸããåŒã®äžèŠ§ã§æ§æãããã³ã³ãã§åºåãããŸãã åäžåŒèŠçŽ åæååã¯äžæ¬åŒ§ã䜿ããã«èšè¿°ã§ããŸãããã¡ã³ããŒåæååãšã®æ··åãé¿ããããã«ä»£å
¥åŒã«ã¯ã§ããŸããã
non_assignment_expressionçç£ã¯ §12.25 ã§å®çŸ©ãããŠããŸãã
äŸ: ã³ã¬ã¯ã·ã§ã³åæååãå«ããªããžã§ã¯ãäœæåŒã®äŸã次ã«ç€ºããŸãã
List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };çµäºãµã³ãã«
ã³ã¬ã¯ã·ã§ã³åæååãé©çšãããã³ã¬ã¯ã·ã§ã³ ãªããžã§ã¯ãã¯ã System.Collections.IEnumerable ãå®è£
ããåã§ããããã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã æå®ãããèŠçŽ ããšã«ãå·Šããå³ã®é åºã§ãéåžžã®ã¡ã³ããŒæ€çŽ¢ãé©çšããã Addãšããååã®ã¡ã³ããŒãæ€çŽ¢ãããŸãã ã¡ã³ããŒæ€çŽ¢ã®çµæãã¡ãœãã ã°ã«ãŒãã§ãªãå Žåã¯ãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã ãã以å€ã®å Žåã¯ãèŠçŽ åæååã®åŒãªã¹ããåŒæ°ãªã¹ããšããŠãªãŒããŒããŒã解決ãé©çšãããã³ã¬ã¯ã·ã§ã³åæååã«ãã£ãŠçµæã®ã¡ãœãããåŒã³åºãããŸãã ãããã£ãŠãã³ã¬ã¯ã·ã§ã³ ãªããžã§ã¯ãã«ã¯ãåèŠçŽ åæååã®åå Add ãæã€é©çšå¯èœãªã€ã³ã¹ã¿ã³ã¹ãŸãã¯æ¡åŒµã¡ãœãããå«ãŸããŠããå¿
èŠããããŸãã
äŸ: ååãšé»è©±çªå·ã®äžèЧãæã€é£çµ¡å ã衚ãã¯ã©ã¹ãšã
List<Contact>ã®äœæãšåæåãæ¬¡ã«ç€ºããŸããpublic class Contact { public string Name { get; set; } public List<string> PhoneNumbers { get; } = new List<string>(); } class A { static void M() { var contacts = new List<Contact> { new Contact { Name = "Chris Smith", PhoneNumbers = { "206-555-0101", "425-882-8080" } }, new Contact { Name = "Bob Harris", PhoneNumbers = { "650-555-0199" } } }; } }次ãšåã广ãæã€
var __clist = new List<Contact>(); Contact __c1 = new Contact(); __c1.Name = "Chris Smith"; __c1.PhoneNumbers.Add("206-555-0101"); __c1.PhoneNumbers.Add("425-882-8080"); __clist.Add(__c1); Contact __c2 = new Contact(); __c2.Name = "Bob Harris"; __c2.PhoneNumbers.Add("650-555-0199"); __clist.Add(__c2); var contacts = __clist;ããã§ã
__clistã__c1ããã³__c2ã¯ããã以å€ã®å Žåã¯é衚瀺ã§ã¢ã¯ã»ã¹ã§ããªãäžæçãªå€æ°ã§ããçµäºãµã³ãã«
12.8.17.3 å¿åãªããžã§ã¯ãäœæåŒ
anonymous_object_creation_expression ã¯ãå¿ååã®ãªããžã§ã¯ããäœæããããã«äœ¿çšãããŸãã
anonymous_object_creation_expression
: 'new' anonymous_object_initializer
;
anonymous_object_initializer
: '{' member_declarator_list? '}'
| '{' member_declarator_list ',' '}'
;
member_declarator_list
: member_declarator (',' member_declarator)*
;
member_declarator
: simple_name
| member_access
| null_conditional_projection_initializer
| base_access
| identifier '=' expression
;
å¿åãªããžã§ã¯ãåæååã¯å¿ååã宣èšãããã®åã®ã€ã³ã¹ã¿ã³ã¹ãè¿ããŸãã å¿ååã¯ã objectããçŽæ¥ç¶æ¿ããååã®ãªãã¯ã©ã¹åã§ãã å¿ååã®ã¡ã³ããŒã¯ãåã®ã€ã³ã¹ã¿ã³ã¹ãäœæããããã«äœ¿çšãããå¿åãªããžã§ã¯ãåæååããæšè«ãããèªã¿åãå°çšããããã£ã®ã·ãŒã±ã³ã¹ã§ãã å
·äœçã«ã¯ããã©ãŒã ã®å¿åãªããžã§ã¯ãåæåå
new {
pâ=eâ,pâ=eâ, âŠ
pv=ev}
ãã©ãŒã ã®å¿ååã宣èšããŸã
class __Anonymous1
{
private readonly «T1» «f1»;
private readonly «T2» «f2»;
...
private readonly «Tn» «fn»;
public __Anonymous1(«T1» «a1», «T2» «a2»,..., «Tn» «an»)
{
«f1» = «a1»;
«f2» = «a2»;
...
«fn» = «an»;
}
public «T1» «p1» { get { return «f1»; } }
public «T2» «p2» { get { return «f2»; } }
...
public «Tn» «pn» { get { return «fn»; } }
public override bool Equals(object __o) { ... }
public override int GetHashCode() { ... }
}
ããã§ãå «Tx» ã¯ã察å¿ããåŒ Â«ex» ã®åã§ãã
member_declarator ã§äœ¿çšãããåŒã¯åãæã€å¿
èŠããããŸãã ãããã£ãŠã member_declarator å
ã®åŒã null ãŸãã¯å¿å颿°ã®ã³ã³ãã€ã«æãšã©ãŒã«ãªããŸãã
å¿ååã®ååãšãã® Equals ã¡ãœããã®ãã©ã¡ãŒã¿ãŒã¯ãã³ã³ãã€ã©ã«ãã£ãŠèªåçã«çæãããããã°ã©ã ããã¹ãã§ã¯åç
§ã§ããŸããã
åãããã°ã©ã å ã§ãåãååãšã³ã³ãã€ã«æã®åã®äžé£ã®ããããã£ãåãé åºã§æå®ãã 2 ã€ã®å¿åãªããžã§ã¯ãåæååã¯ãåãå¿ååã®ã€ã³ã¹ã¿ã³ã¹ãçæããŸãã
äŸ: ãã®äŸã§ã¯
var p1 = new { Name = "Lawnmower", Price = 495.00 }; var p2 = new { Name = "Shovel", Price = 26.95 }; p1 = p2;
p1ãšp2ãåãå¿ååã§ãããããæåŸã®è¡ã®å²ãåœãŠãèš±å¯ãããŸããçµäºãµã³ãã«
å¿ååã® Equals ã¡ãœãããš GetHashcode ã¡ãœããã¯ã objectããç¶æ¿ãããã¡ãœããããªãŒããŒã©ã€ãããããããã£ã® Equals ãš GetHashcode ã®èгç¹ããå®çŸ©ããããããåãå¿ååã® 2 ã€ã®ã€ã³ã¹ã¿ã³ã¹ã¯ããã¹ãŠã®ããããã£ãçããå Žåã«ã®ã¿çãããªããŸãã
ã¡ã³ããŒå®£èšåã¯ãåçŽãªåå (§12.8.4)ãã¡ã³ã㌠ã¢ã¯ã»ã¹ (§12.8.7)ãnull æ¡ä»¶ä»ããããžã§ã¯ã·ã§ã³åæåå §12.8.8 ãŸãã¯ããŒã¹ ã¢ã¯ã»ã¹ (§12.8.15) ã«çç¥ã§ããŸãã ããã¯ã ãããžã§ã¯ã·ã§ã³åæåå ãšåŒã°ããåãååã®ããããã£ã®å®£èšãšå²ãåœãŠã®ç瞮圢ã§ãã å ·äœçã«ã¯ã圢åŒã®ã¡ã³ããŒå®£èšå
«identifier»ã «expr» . «identifier» ãã㳠«expr» ? . «identifier»
ã¯ãããããæ¬¡ãšãŸã£ããåãã§ãã
«identifier» = «identifier»ã «identifier» = «expr» . «identifier» ãã㳠«identifier» = «expr» ? . «identifier»
ãããã£ãŠããããžã§ã¯ã·ã§ã³åæååã§ã¯ãèå¥åã¯å€ãšãå€ãå²ãåœãŠãããŠãããã£ãŒã«ããŸãã¯ããããã£ã®äž¡æ¹ãéžæããŸãã çŽæçã«ããããžã§ã¯ã·ã§ã³åæååã¯å€ã ãã§ãªããå€ã®ååãæåœ±ããŸãã
12.8.17.4 é åäœæåŒ
array_creation_expression ã¯ã array_typeã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããããã«äœ¿çšãããŸãã
array_creation_expression
: 'new' non_array_type '[' expression_list ']' rank_specifier*
array_initializer?
| 'new' array_type array_initializer
| 'new' rank_specifier array_initializer
;
æåã®ãã©ãŒã ã®é åäœæåŒã¯ãåŒãªã¹ãããåã ã®åŒãåé€ããçµæãšããŠçããåã®é åã€ã³ã¹ã¿ã³ã¹ãå²ãåœãŠãŸãã
ããã äŸ: é åäœæåŒ
new int[10,20]ã¯åint[,]ã®é åã€ã³ã¹ã¿ã³ã¹ãçæããé åäœæåŒ newint[10][,]ã¯åint[][,]ã®é åã€ã³ã¹ã¿ã³ã¹ãçæããŸãã çµäºãµã³ãã«
åŒãªã¹ãå
ã®ååŒã¯ã intã uintã longããŸã㯠ulongã®åã§ãããããŸãã¯ãããã®åã® 1 ã€ä»¥äžã«æé»çã«å€æå¯èœã§ããå¿
èŠããããŸãã ååŒã®å€ã«ãã£ãŠãæ°ããå²ãåœãŠãããé
åã€ã³ã¹ã¿ã³ã¹å
ã®å¯Ÿå¿ãããã£ã¡ã³ã·ã§ã³ã®é·ããæ±ºãŸããŸãã é
忬¡å
ã®é·ãã¯è² ã®å€ã§ãªããããåŒãªã¹ãå
ã§è² ã®å€ãæã€å®æ°åŒãæã€ããšã¯ã³ã³ãã€ã«æãšã©ãŒã§ãã
å®å šã§ãªãã³ã³ããã¹ã (§24.2) ãé€ããé åã®ã¬ã€ã¢ãŠãã¯æå®ãããŠããŸããã
æåã®åœ¢åŒã®é åäœæåŒã«é ååæååãå«ãŸããŠããå ŽåãåŒãªã¹ãå ã®ååŒã¯å®æ°ã§ãåŒãªã¹ãã§æå®ãããã©ã³ã¯ã𿬡å ã®é·ãã¯é ååæååã®é·ããšäžèŽããå¿ èŠããããŸãã
2 çªç®ãŸã㯠3 çªç®ã®åœ¢åŒã®é åäœæåŒã§ã¯ãæå®ãããé ååãŸãã¯ã©ã³ã¯æå®åã®ã©ã³ã¯ã¯ãé ååæååã®ã©ã³ã¯ãšäžèŽããå¿ èŠããããŸãã åã ã®æ¬¡å ã®é·ãã¯ãé ååæååã®å¯Ÿå¿ããå ¥ãåã¬ãã«ã®èŠçŽ ã®æ°ããæšè«ãããŸãã ãããã£ãŠã次ã®å®£èšã«ãããåæåååŒ
var a = new int[,] {{0, 1}, {2, 3}, {4, 5}};
ãšæ£ç¢ºã«äžèŽããŸãã
var a = new int[3, 2] {{0, 1}, {2, 3}, {4, 5}};
3 çªç®ã®åœ¢åŒã®é åäœæåŒã¯ã æé»çã«åæå®ãããé åäœæåŒãšåŒã°ããŸãã ããã¯ãé åã®èŠçŽ åãæç€ºçã«æå®ãããŠããªãããé ååæååã®åŒã»ããã®æãäžè¬çãªå (§12.6.3.17) ãšããŠæ±ºå®ãããããšãé€ããŠã2 çªç®ã®åœ¢åŒã«äŒŒãŠããŸãã 倿¬¡å é å (ã€ãŸãã rank_specifier ã«å°ãªããšã 1 ã€ã®ã³ã³ããå«ãŸããé å) ã®å Žåããã®ã»ããã¯ãå ¥ãåã«ãªã£ã array_initializerã§èŠã€ãã£ããã¹ãŠã® åŒã§æ§æãããŸãã
é ååæååã«ã€ããŠã¯ã §17.7ã§è©³ãã説æããŸãã
é åäœæåŒãè©äŸ¡ããçµæã¯ãå€ãã€ãŸãæ°ããå²ãåœãŠãããé åã€ã³ã¹ã¿ã³ã¹ãžã®åç §ãšããŠåé¡ãããŸãã é åäœæåŒã®å®è¡æåŠçã¯ãæ¬¡ã®æé ã§æ§æãããŸãã
-
expression_list ã®æ¬¡å
ã®é·ãã®åŒã¯ãå·Šããå³ã®é ã«è©äŸ¡ãããŸãã åã€ã³ããã¯ã¹åŒã®è©äŸ¡ã®åŸãæé»çãªå€æ (§10.2) ãæ¬¡ã®ããããã®åã«å€æããŸãã
intãuintãlongãulongã æé»çãªå€æãååšãããã®ãªã¹ãã®æåã®åãéžæãããŸãã åŒã®è©äŸ¡ãŸãã¯ãã®åŸã®æé»çãªå€æã«ãã£ãŠäŸå€ãçºçããå Žåããã以äžã®åŒã¯è©äŸ¡ãããŸããããã以äžã®æé ã¯å®è¡ãããŸããã - ãã£ã¡ã³ã·ã§ã³ã®é·ãã®èšç®å€ã¯ã次ã®ããã«æ€èšŒãããŸãã1 ã€ä»¥äžã®å€ã 0 æªæºã®å Žåã
System.OverflowExceptionãã¹ããŒããããã以äžã®æé ã¯å®è¡ãããŸããã - æå®ãããæ¬¡å
ã®é·ããæã€é
åã€ã³ã¹ã¿ã³ã¹ãå²ãåœãŠãããŸãã æ°ããã€ã³ã¹ã¿ã³ã¹ãå²ãåœãŠãã®ã«ååãªã¡ã¢ãªããªãå Žåã¯ã
System.OutOfMemoryExceptionãã¹ããŒããããã以äžã®æé ã¯å®è¡ãããŸããã - æ°ããé åã€ã³ã¹ã¿ã³ã¹ã®ãã¹ãŠã®èŠçŽ ã¯ãæ¢å®å€ (§9.3) ã«åæåãããŸãã
- é åäœæåŒã«é ååæååãå«ãŸããŠããå Žåãé ååæååå ã®ååŒãè©äŸ¡ããã察å¿ããé åèŠçŽ ã«å²ãåœãŠãããŸãã è©äŸ¡ãšä»£å ¥ã¯ãåŒãé ååæååã«æžã蟌ãŸããé åºã§å®è¡ãããŸããã€ãŸããèŠçŽ ã¯ã€ã³ããã¯ã¹ã®é åºãå¢ãããŠåæåãããå³ç«¯ã®æ¬¡å ãæåã«å¢å ããŸãã ç¹å®ã®åŒã®è©äŸ¡ãŸãã¯å¯Ÿå¿ããé åèŠçŽ ãžã®åŸç¶ã®ä»£å ¥ã«ãã£ãŠäŸå€ãçºçããå Žåããã以äžã®èŠçŽ ã¯åæåãããŸãã (ãã®ãããæ®ãã®èŠçŽ ã«ã¯æ¢å®å€ãèšå®ãããŸã)ã
é åäœæåŒã§ã¯ãé ååã®èŠçŽ ãå«ãé åã®ã€ã³ã¹ã¿ã³ã¹åãå¯èœã§ããããã®ãããªé åã®èŠçŽ ã¯æåã§åæåããå¿ èŠããããŸãã
äŸã®: ã¹ããŒãã¡ã³ã
int[][] a = new int[100][];ã¯ã
int[]åã® 100 åã®èŠçŽ ãæã€ 1 次å é åãäœæããŸãã åèŠçŽ ã®åæå€ã¯nullã§ãã åãé åäœæåŒã§ãµãé åãšã¹ããŒãã¡ã³ããã€ã³ã¹ã¿ã³ã¹åããããšã¯ã§ããŸãããint[][] a = new int[100][5]; // Errorã®å Žåãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã ãµãé åã®ã€ã³ã¹ã¿ã³ã¹åã¯ã次ã®ããã«æåã§å®è¡ã§ããŸãã
int[][] a = new int[100][]; for (int i = 0; i < 100; i++) { a[i] = new int[5]; }çµäºãµã³ãã«
泚: é åã®é åã« "åè§åœ¢" ã®å³åœ¢ãããå Žåãã€ãŸããµãé åããã¹ãŠåãé·ãã®å Žåã¯ã倿¬¡å é åã䜿çšããæ¹ãå¹ççã§ãã äžèšã®äŸã§ã¯ãé åã®é åãã€ã³ã¹ã¿ã³ã¹åãããšã101 åã®ãªããžã§ã¯ã (1 ã€ã®å€åŽã®é åãš 100 åã®ãµãé å) ãäœæãããŸãã ããã«å¯ŸããŠ
int[,] a = new int[100, 5];ã§ã¯ã1 ã€ã®ãªããžã§ã¯ã (2 次å é å) ã®ã¿ãäœæããã1 ã€ã®ã¹ããŒãã¡ã³ãã§å²ãåœãŠãå®è¡ãããŸãã
泚é
äŸ: æé»çã«åæå®ãããé åäœæåŒã®äŸã次ã«ç€ºããŸãã
var a = new[] { 1, 10, 100, 1000 }; // int[] var b = new[] { 1, 1.5, 2, 2.5 }; // double[] var c = new[,] { { "hello", null }, { "world", "!" } }; // string[,] var d = new[] { 1, "one", 2, "two" }; // ErroræåŸã®åŒã§ã¯ã
intãstringãäºãã«æé»çã«å€æããããšãã§ããªããããæé©ãªå ±éåãååšãããã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã ãã®å Žåã¯ãæç€ºçã«åæå®ãããé åäœæåŒã䜿çšããå¿ èŠããããŸããããšãã°ãobject[]ããåãæå®ããŸãã ãŸãã¯ãããããã®èŠçŽ ãå ±éã®åºæ¬åã«ãã£ã¹ãããŠãæšè«ãããèŠçŽ åã«ããããšãã§ããŸããçµäºãµã³ãã«
æé»çã«åæå®ãããé åäœæåŒãå¿åãªããžã§ã¯ãåæåå (§12.8.17.3) ãšçµã¿åãããŠãå¿ååã®ããŒã¿æ§é ãäœæã§ããŸãã
äŸ:
var contacts = new[] { new { Name = "Chris Smith", PhoneNumbers = new[] { "206-555-0101", "425-882-8080" } }, new { Name = "Bob Harris", PhoneNumbers = new[] { "650-555-0199" } } };çµäºãµã³ãã«
12.8.17.5 ããªã²ãŒãäœæåŒ
delegate_creation_expression ã¯ã delegate_typeã®ã€ã³ã¹ã¿ã³ã¹ãååŸããããã«äœ¿çšãããŸãã
delegate_creation_expression
: 'new' delegate_type '(' expression ')'
;
ããªã²ãŒãäœæåŒã®åŒæ°ã¯ãã¡ãœãã ã°ã«ãŒããå¿å颿°ããŸãã¯ã³ã³ãã€ã«æã®å dynamic ãŸã㯠delegate_typeã®ããããã®å€ã«ãªããŸãã åŒæ°ãã¡ãœãã ã°ã«ãŒãã®å Žåã¯ãã¡ãœãããèå¥ããã€ã³ã¹ã¿ã³ã¹ ã¡ãœããã®å Žåã¯ããªã²ãŒããäœæãããªããžã§ã¯ããèå¥ããŸãã åŒæ°ãå¿å颿°ã®å Žåãããªã²ãŒã ã¿ãŒã²ããã®ãã©ã¡ãŒã¿ãŒãšã¡ãœããæ¬äœãçŽæ¥å®çŸ©ããŸãã åŒæ°ãå€ã®å Žåãã³ããŒãäœæããããªã²ãŒã ã€ã³ã¹ã¿ã³ã¹ãèå¥ããŸãã
åŒã«ã³ã³ãã€ã«æã®ådynamicãããå Žåãdelegate_creation_expressionã¯åçã«ãã€ã³ããã (§12.8.17.5)ãæ¬¡ã®èŠåã¯å®è¡æã«åŒã®å®è¡æåã䜿çšããŠé©çšãããŸãã ãã以å€ã®å Žåãã«ãŒã«ã¯ã³ã³ãã€ã«æã«é©çšãããŸãã
ã D(E) ããã³ D ã expression ã§ãã圢åŒnew Eã® delegate_creation_expression ã®ãã€ã³ãã£ã³ã°æã®åŠçã¯ãæ¬¡ã®æé ã§æ§æãããŸãã
Eãã¡ãœãã ã°ã«ãŒãã®å Žåãããªã²ãŒãäœæåŒã¯ãã¡ãœãã ã°ã«ãŒã倿 (§10.8) ãšåãæ¹æ³ã§EããDã«åŠçãããŸããEãå¿å颿°ã®å Žåãããªã²ãŒãäœæåŒã¯ã ããEãžã®å¿å颿°å€æ (D) ãšåãæ¹æ³ã§åŠçãããŸããEãå€ã®å ŽåãEã¯ãšäºææ§ããã (D)ãçµæã¯ãEãåŒã³åºãåäžãšã³ããªåŒã³åºããªã¹ããæã€æ°ããäœæãããããªã²ãŒããžã®åç §ã«ãªããŸãã
ã D(E) ããã³ D ã expression ã§ãã圢åŒnew Eã® delegate_creation_expression ã®å®è¡æã®åŠçã¯ãæ¬¡ã®æé ã§æ§æãããŸãã
-
Eãã¡ãœãã ã°ã«ãŒãã®å Žåãããªã²ãŒãäœæåŒã¯ã¡ãœãã ã°ã«ãŒã倿 (§10.8) ãšããŠEããDã«è©äŸ¡ãããŸãã -
Eãå¿å颿°ã®å Žåãããªã²ãŒãã®äœæã¯ãEããD(§10.7) ãžã®å¿å颿°å€æãšããŠè©äŸ¡ãããŸãã -
Eã delegate_typeã®å€ã®å Žå:-
Eãè©äŸ¡ãããŸãã ãã®è©äŸ¡ã«ãã£ãŠäŸå€ãçºçããå Žåããã以äžã®æé ã¯å®è¡ãããŸããã -
Eã®å€ãnullã®å ŽåãSystem.NullReferenceExceptionãã¹ããŒããããã以äžã®æé ã¯å®è¡ãããŸããã -
Dããªã²ãŒãåã®æ°ããã€ã³ã¹ã¿ã³ã¹ãå²ãåœãŠãããŸãã æ°ããã€ã³ã¹ã¿ã³ã¹ãå²ãåœãŠãã®ã«ååãªã¡ã¢ãªããªãå Žåã¯ãSystem.OutOfMemoryExceptionãã¹ããŒããããã以äžã®æé ã¯å®è¡ãããŸããã - æ°ããããªã²ãŒã ã€ã³ã¹ã¿ã³ã¹ã¯ã
EãåŒã³åºãåäžãšã³ããªåŒã³åºããªã¹ãã§åæåãããŸãã
-
ããªã²ãŒãã®åŒã³åºããªã¹ãã¯ãããªã²ãŒããã€ã³ã¹ã¿ã³ã¹åããããšãã«æ±ºå®ãããããªã²ãŒãã®æå¹æéå šäœã«ããã£ãŠäžå®ã®ãŸãŸã«ãªããŸãã ã€ãŸããäœæãããããªã²ãŒãã®ã¿ãŒã²ããåŒã³åºãå¯èœãšã³ãã£ãã£ã倿Žããããšã¯ã§ããŸããã
泚æ:2ã€ã®ããªã²ãŒããçµåããããšãããŸãã¯1ã€ãå¥ã®ããªã²ãŒãããåé€ããããšããæ°ããããªã²ãŒãã®çµæãèŠããŠãããŠãã ãããæ¢åã®ããªã²ãŒãã®ã³ã³ãã³ãã倿ŽãããŠããªãã æ³šé
ããããã£ãã€ã³ãã¯ãµãŒããŠãŒã¶ãŒå®çŸ©æŒç®åãã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒããã¡ã€ãã©ã€ã¶ãŒããŸãã¯éçã³ã³ã¹ãã©ã¯ã¿ãŒãåç §ããããªã²ãŒããäœæããããšã¯ã§ããŸããã
äŸ: åè¿°ã®ããã«ãããªã²ãŒããã¡ãœãã ã°ã«ãŒãããäœæããããšãã«ãããªã²ãŒãã®ãã©ã¡ãŒã¿ãŒ ãªã¹ããšæ»ãå€ã®åã«ãã£ãŠãã©ã®ãªãŒããŒããŒããããã¡ãœãããéžæããããæ±ºãŸããŸãã ãã®äŸã§ã¯
delegate double DoubleFunc(double x); class A { DoubleFunc f = new DoubleFunc(Square); static float Square(float x) => x * x; static double Square(double x) => x * x; }
A.fãã£ãŒã«ãã¯ã2 çªç®ã®Squareã¡ãœãããåç §ããããªã²ãŒãã§åæåãããŸããããã¯ããã®ã¡ãœãããDoubleFuncã®ãã©ã¡ãŒã¿ãŒ ãªã¹ããšæ»ãå€ã®åãšå®å šã«äžèŽããããã§ãã 2 çªç®ã®Squareã¡ãœãããååšããªãå Žåã¯ãã³ã³ãã€ã«æãšã©ãŒãçºçããå¯èœæ§ããããŸããçµäºãµã³ãã«
12.8.18 typeof æŒç®å
typeof æŒç®åã¯ãåã® System.Type ãªããžã§ã¯ããååŸããããã«äœ¿çšãããŸãã
typeof_expression
: 'typeof' '(' type ')'
| 'typeof' '(' unbound_type_name ')'
| 'typeof' '(' 'void' ')'
;
unbound_type_name
: identifier generic_dimension_specifier?
('.' identifier generic_dimension_specifier?)*
| unbound_qualified_alias_member
('.' identifier generic_dimension_specifier?)*
;
unbound_qualified_alias_member
: identifier '::' identifier generic_dimension_specifier?
;
generic_dimension_specifier
: '<' comma* '>'
;
comma
: ','
;
typeof_expression ã®æåã®åœ¢åŒã¯ã typeof ããŒã¯ãŒãã®åŸã«ãã£ãã§å²ãŸããåã§æ§æãããŸãã ãã®åœ¢åŒã®åŒã®çµæã¯ãæå®ãããåã® System.Type ãªããžã§ã¯ãã§ãã ç¹å®ã®åã«å¯Ÿã㊠System.Type ãªããžã§ã¯ã㯠1 ã€ã ãååšããŸãã ã€ãŸãã Tåã®å Žåã typeof(T) == typeof(T) ã¯åžžã« true ã«ãªããŸãã åã dynamicã«ããããšãã§ããŸããã
typeof_expression ã® 2 çªç®ã®åœ¢åŒã¯ã typeof ããŒã¯ãŒãã®åŸã«ãã£ãã§å²ãŸãã unbound_type_nameã§æ§æãããŸãã
泚: unbound_type_nameããã³unbound_qualified_alias_memberã®ææ³ã¯ãtype_name (§7.7) ããã³qualified_alias_member (§14.9.1) ã®ææ³ã«åŸããŸãããã ããgeneric_dimension_specifier㯠type_argument_listã«çœ®ãæããããŸãã æ³šé
typeof_expressionã®ãªãã©ã³ããèªèããéã«ãunbound_type_nameãštype_nameã®äž¡æ¹ã該åœããgeneric_dimension_specifierããã³type_argument_listãå«ãŸãªãå Žåãtype_nameãéžã°ããªããã°ãªããŸããã
泚: ANTLR ã¯ãtypeof_expressionã®ä»£æ¿ã®é åºã«ãããæå®ãããéžæãèªåçã«è¡ããŸãã æ³šé
unbound_type_nameã®æå³ã¯ã次ã®ããã«æ±ºå®ãããŸãã
- ããŒã¯ã³ã®ã·ãŒã±ã³ã¹ã¯ãågeneric_dimension_specifierããåtype_argumentãšåãæ°ã®ã³ã³ããšããŒã¯ãŒã ãæã€
objectã«çœ®ãæããããšã«ãã£ãŠãtype_nameã«å€æãããŸãã - çµæã® type_name ã¯ãæ§ç¯ãããå (§7.7) ã«è§£æ±ºãããŸãã
- unbound_type_nameã¯ã解決ãããæ§ç¯å (§8.4) ã«é¢é£ä»ããããéé£çµãžã§ããªãã¯åã§ãã
泚: ããŒã¯ã³ã®ã·ãŒã±ã³ã¹ã倿ããå®è£ ããŸãã¯äžéæ§ç¯åãçæããå¿ èŠã¯ãããŸããããã®ããã»ã¹ã«åŸã£ãå Žåãšåãããã«ã決å®ãããéé£çµãžã§ããªãã¯å㯠"ãã®ãŸãŸ" ã§ãã æ³šé
ååã null 蚱容åç §åã§ããããšã¯ãšã©ãŒã§ãã
typeof_expression ã®çµæã¯ãçµæãšããŠåŸãããéé£çµãžã§ããªãã¯åã® System.Type ãªããžã§ã¯ãã§ãã
3 çªç®ã®åœ¢åŒã® typeof_expression ã¯ã typeof ããŒã¯ãŒãã®åŸã«ããã£ãã§å²ãŸãã void ããŒã¯ãŒãã§æ§æãããŸãã ãã®ãã©ãŒã ã®åŒã®çµæã¯ãåãååšããªãããšã衚ã System.Type ãªããžã§ã¯ãã§ãã
typeof(void) ã«ãã£ãŠè¿ãããåãªããžã§ã¯ãã¯ãä»»æã®åã«å¯ŸããŠè¿ãããåãªããžã§ã¯ããšã¯ç°ãªããŸãã
泚æ: ãã®ç¹æ®ãª
System.Typeãªããžã§ã¯ãã¯ãèšèªå ã®ã¡ãœãããžã®ãªãã¬ã¯ã·ã§ã³ãå¯èœã«ããã¯ã©ã¹ ã©ã€ãã©ãªã§åœ¹ç«ã¡ãŸãããããã®ã¡ãœããã¯ãvoidã¡ãœãããå«ãä»»æã®ã¡ãœããã®æ»ãå€ã®åãSystem.Typeã®ã€ã³ã¹ã¿ã³ã¹ã§è¡šãæ¹æ³ãæã€ããšãæã¿ãŸãã æ³šé
typeof æŒç®åã¯ãåãã©ã¡ãŒã¿ãŒã§äœ¿çšã§ããŸãã ååã null 蚱容åç
§åã§ããããšãããã£ãŠããã°ãã³ã³ãã€ã«æãšã©ãŒã«ãªããŸãã çµæã¯ãåãã©ã¡ãŒã¿ãŒã«ãã€ã³ããããã©ã³ã¿ã€ã åã® System.Type ãªããžã§ã¯ãã§ãã ã¿ã³ã¿ã€ã æã®åã null 蚱容åç
§åã®å Žåãçµæã¯å¯Ÿå¿ãã null é蚱容åç
§åã«ãªããŸãã
typeof æŒç®åã¯ãæ§ç¯ãããåãŸãã¯ãã€ã³ããããŠããªããžã§ããªãã¯å (§8.4.4) ã§ã䜿çšã§ããŸãã ãã€ã³ããããŠããªããžã§ããªãã¯åã® System.Type ãªããžã§ã¯ãã¯ãã€ã³ã¹ã¿ã³ã¹å (System.Type) ã® ãªããžã§ã¯ããšåãã§ã¯ãããŸããã ã€ã³ã¹ã¿ã³ã¹åã¯å®è¡æã«åžžã«éããæ§ç¯åã§ããããããã® System.Type ãªããžã§ã¯ãã¯äœ¿çšäžã®å®è¡æã®ååŒæ°ã«äŸåããŸãã äžæ¹ããã€ã³ããããŠããªããžã§ããªãã¯åã«ã¯ååŒæ°ããªããã©ã³ã¿ã€ã ååŒæ°ã«é¢ä¿ãªãåã System.Type ãªããžã§ã¯ããçæãããŸãã
äŸ: ãã®äŸ
class X<T> { public static void PrintTypes() { Type[] t = { typeof(int), typeof(System.Int32), typeof(string), typeof(double[]), typeof(void), typeof(T), typeof(X<T>), typeof(X<X<T>>), typeof(X<>) }; for (int i = 0; i < t.Length; i++) { Console.WriteLine(t[i]); } } } class Test { static void Main() { X<int>.PrintTypes(); } }çæãããåºåã¯æ¬¡ã®ãšããã§ãã
System.Int32 System.Int32 System.String System.Double[] System.Void System.Int32 X`1[System.Int32] X`1[X`1[System.Int32]] X`1[T]
intãšSystem.Int32ã¯åãåã§ããããšã«æ³šæããŠãã ãããtypeof(X<>)ã®çµæã¯ååŒæ°ã«äŸåããŸããããtypeof(X<T>)ã®çµæã¯äŸåããŸããçµäºãµã³ãã«
12.8.19 sizeof æŒç®å
sizeof ã¯ãæå®ãããåã®å€æ°ãå æããŠãã8ããããã€ããè¿ããŸãã
sizeof_expression
: 'sizeof' '(' unmanaged_type ')'
;
ç¹å®ã®åã®å Žåã sizeof æŒç®åã¯ã次ã®è¡šã«ç€ºãããã«å®æ° int å€ãçæããŸãã
| åŒ | çµæ |
|---|---|
sizeof(sbyte) |
1 |
sizeof(byte) |
1 |
sizeof(short) |
2 |
sizeof(ushort) |
2 |
sizeof(int) |
4 |
sizeof(uint) |
4 |
sizeof(long) |
8 |
sizeof(ulong) |
8 |
sizeof(char) |
2 |
sizeof(float) |
4 |
sizeof(double) |
8 |
sizeof(bool) |
1 |
sizeof(decimal) |
16 |
åæå Tã®å ŽåãåŒ sizeof(T) ã®çµæã¯ãäžèšã®ããã«ãåºã«ãªãåã®ãµã€ãºãšçãã宿°å€ã«ãªããŸãã
ãã®ä»ã®ãã¹ãŠã®ãªãã©ã³ãåã®å Žåã sizeof æŒç®å㯠§24.6.9 ã§æå®ãããå®å
šã§ãªãã³ã³ããã¹ãã§ã®ã¿äœ¿çšã§ããŸãã
12.8.20 ãã§ãã¯æžã¿ããã³æªãã§ãã¯ã®æŒç®å
checked ããã³ unchecked æŒç®åã¯ãæŽæ°åã®ç®è¡æŒç®ããã³å€æã«å¯ŸãããªãŒããŒãã㌠ãã§ã㯠ã³ã³ããã¹ããå¶åŸ¡ããããã«äœ¿çšããŸãã ãŸãããŠãŒã¶ãŒå®çŸ©å (§15.10.1) ã«é¢é£ããããŸããŸãªæäœã倿ã®ãªãŒããŒãã㌠ãã§ã㯠ã³ã³ããã¹ããå¶åŸ¡ããããã«ã䜿çšã§ããŸãã
checked_expression
: 'checked' '(' expression ')'
;
unchecked_expression
: 'unchecked' '(' expression ')'
;
checked æŒç®åã¯ããã§ãã¯ãããã³ã³ããã¹ãã«å«ãŸããŠããåŒãè©äŸ¡ãã unchecked æŒç®åã¯ããã§ãã¯ãããŠããªãã³ã³ããã¹ãã«å«ãŸããŠããåŒãè©äŸ¡ããŸãã
checked_expression ãŸã㯠unchecked_expression ã¯ãparenthesized_expression (§12.8.5) ã«æ£ç¢ºã«å¯Ÿå¿ããŸãããå«ãŸããå€ã¯ãæå®ã®ãªãŒããŒãããŒç¢ºèªã³ã³ããã¹ãã§è©äŸ¡ãããŸãã
ãªãŒããŒãã㌠ãã§ã㯠ã³ã³ããã¹ãã¯ã checked ããã³ unchecked ã¹ããŒãã¡ã³ã (§13.12) ã䜿çšããŠå¶åŸ¡ããããšãã§ããŸãã
æ¬¡ã®æŒç®ã¯ããã§ãã¯ãããæŒç®åãšãã§ãã¯ãããŠããªãæŒç®åãšã¹ããŒãã¡ã³ãã«ãã£ãŠç¢ºç«ããããªãŒããŒãã㌠ãã§ã㯠ã³ã³ããã¹ãã®åœ±é¿ãåããŸãã
- ãªãã©ã³ããæŽæ°åãŸãã¯åæåã®å Žåãå®çŸ©æžã¿ã®
++æŒç®åãš--æŒç®å (§12.8.16 ãã㳠§12.9.7)ã - ãªãã©ã³ããæŽæ°åã®å Žåãå®çŸ©æžã¿ã®
-åé æŒç®å (§12.9.3)ã - äž¡æ¹ã®ãªãã©ã³ããæŽæ°åãŸãã¯åæåã®å Žåãå®çŸ©æžã¿ã®
+ã-ã*ãããã³/äºé æŒç®å (§12.13)ã - 1 ã€ã®æŽæ°åãŸãã¯åæåããå¥ã®æŽæ°åãŸãã¯åæåãžã®æç€ºçãªæ°å€å€æ (§10.3.2)ããŸãã¯
floatãŸãã¯doubleããæŽæ°åãŸãã¯åæåãžã®å€æã - ãªãã©ã³ãåã§ãã§ãã¯ããã圢åŒã®æŒç®åã宣èšãããŠããå ŽåããŠãŒã¶ãŒå®çŸ©ã®
++ã--ãåé-ããã€ããª+ã-ã*ãããã³/æŒç®å (§15.10.1)ã - ãŠãŒã¶ãŒå®çŸ©ã®æç€ºçãªå€ææŒç®å (§15.10.4)ã
äžèšã®ããããã®æŒç®ã§çµæãçæããã倿å ã®åã§è¡šãã«ã¯å€§ããããå ŽåãæŒç®ãå®è¡ãããã³ã³ããã¹ãã«ãã£ãŠçµæã®åäœãå¶åŸ¡ãããŸãã
-
checkedã³ã³ããã¹ãã§ãæäœã宿°åŒ (§12.26) ã®å Žåãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã ãã以å€ã®å Žåã¯ãå®è¡æã«æŒç®ãå®è¡ããããšSystem.OverflowExceptionãã¹ããŒãããŸãã -
uncheckedã³ã³ããã¹ãã§ã¯ãçµæã®æ ŒçŽå ã®åã«åãŸããªãäžäœããããç Žæ£ãããŠãçµæãåãè©°ããããŸãã
ãŸãã¯checkedæŒç®åãŸãã¯ã¹ããŒãã¡ã³ãã§å²ãŸããŠããªãé宿°åŒ (unchecked) (å®è¡æã«è©äŸ¡ãããåŒ) ã®å Žåãå€éšèŠçŽ (ã³ã³ãã€ã© ã¹ã€ãããå®è¡ç°å¢æ§æãªã©) ããã§ãã¯è©äŸ¡ãåŒã³åºããªãéããæ¢å®ã®ãªãŒããŒãã㌠ãã§ã㯠ã³ã³ããã¹ãã¯ãªãã«ãªããŸãã
宿°åŒ (§12.26) (ã³ã³ãã€ã«æã«å®å
šã«è©äŸ¡ã§ããåŒ) ã®å Žåãæ¢å®ã®ãªãŒããŒãã㌠ãã§ã㯠ã³ã³ããã¹ãã¯åžžã«ãã§ãã¯ãããŸãã 宿°åŒã unchecked ã³ã³ããã¹ãã«æç€ºçã«é
眮ãããŠããªãéããåŒã®ã³ã³ãã€ã«æã®è©äŸ¡äžã«çºçãããªãŒããŒãããŒã«ãã£ãŠãåžžã«ã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
å¿å颿°ã®æ¬äœã¯ãå¿å颿°ãçºçãã checked ãŸã㯠unchecked ã³ã³ããã¹ãã®åœ±é¿ãåããŸããã
äŸ: 次ã®ã³ãŒãäŸã®å 容:
class Test { static readonly int x = 1000000; static readonly int y = 1000000; static int F() => checked(x * y); // Throws OverflowException static int G() => unchecked(x * y); // Returns -727379968 static int H() => x * y; // Depends on default }ã©ã¡ãã®åŒãã³ã³ãã€ã«æã«è©äŸ¡ã§ããªãã®ã§ãã³ã³ãã€ã«æãšã©ãŒã¯å ±åãããŸããã å®è¡æã«ã
Fã¡ãœããã¯System.OverflowExceptionãã¹ããŒããGã¡ãœãã㯠â727379968 (ç¯å²å€ã®çµæã®äžäœ 32 ããã) ãè¿ããŸããHã¡ãœããã®åäœã¯ãã³ã³ãã€ã«ã®æ¢å®ã®ãªãŒããŒãã㌠ãã§ã㯠ã³ã³ããã¹ãã«äŸåããŸãããFãšåãããGãšåãã§ããçµäºãµã³ãã«
äŸ: 次ã®ã³ãŒãäŸã®å 容:
class Test { const int x = 1000000; const int y = 1000000; static int F() => checked(x * y); // Compile-time error, overflow static int G() => unchecked(x * y); // Returns -727379968 static int H() => x * y; // Compile-time error, overflow }
Fããã³Hã§å®æ°åŒãè©äŸ¡ãããšãã«çºçãããªãŒããŒãããŒã«ãããåŒãcheckedã³ã³ããã¹ãã§è©äŸ¡ããããããã³ã³ãã€ã«æãšã©ãŒãå ±åãããŸãã ãªãŒããŒãããŒã¯ãGã§å®æ°åŒãè©äŸ¡ãããšãã«ãçºçããŸãããè©äŸ¡ã¯uncheckedã³ã³ããã¹ãã§è¡ãããããããªãŒããŒãããŒã¯å ±åãããŸãããçµäºãµã³ãã«
checked æŒç®åãš unchecked æŒç®åã¯ã"(" ããã³ ")" ããŒã¯ã³å
ã«ããã¹ãã§å«ãŸããæŒç®ã®ãªãŒããŒãã㌠ãã§ã㯠ã³ã³ããã¹ãã«ã®ã¿åœ±é¿ããŸãã æŒç®åã¯ãå«ãŸããŠããåŒãè©äŸ¡ããçµæãšããŠåŒã³åºããã颿°ã¡ã³ããŒã«ã¯åœ±é¿ããŸããã
äŸ: 次ã®ã³ãŒãäŸã®å 容:
class Test { static int Multiply(int x, int y) => x * y; static int F() => checked(Multiply(1000000, 1000000)); }F ã§
checkedã䜿çšããŠãx * yã®Multiplyã®è©äŸ¡ã«ã¯åœ±é¿ããªããããx * yã¯æ¢å®ã®ãªãŒããŒãã㌠ãã§ã㯠ã³ã³ããã¹ãã§è©äŸ¡ãããŸããçµäºãµã³ãã«
unchecked æŒç®åã¯ã笊å·ä»ãæŽæ°åã®å®æ°ã 16 é²è¡šèšã§èšè¿°ããå Žåã«äŸ¿å©ã§ãã
äŸ:
class Test { public const int AllBits = unchecked((int)0xFFFFFFFF); public const int HighBit = unchecked((int)0x80000000); }äžèšã® 16 é²å®æ°ã¯ã©ã¡ãã
uintåã§ãã 宿°ã¯intç¯å²å€ã§ãããããuncheckedæŒç®åã䜿çšããªããšãintã«ãã£ã¹ããããšã³ã³ãã€ã«æãšã©ãŒãçºçããŸããçµäºãµã³ãã«
泚æ:
checkedæŒç®åãšuncheckedæŒç®åãšã¹ããŒãã¡ã³ãã䜿çšãããšãããã°ã©ãã¯ããã€ãã®æ°å€èšç®ã®ç¹å®ã®åŽé¢ãå¶åŸ¡ã§ããŸãã ãã ããäžéšã®æ°å€æŒç®åã®åäœã¯ããªãã©ã³ãã®ããŒã¿åã«ãã£ãŠç°ãªããŸãã ããšãã°ã2ã€ã®å°æ°ãä¹ç®ãããšãæç€ºçãªéãã§ãã¯ã³ã³ããã¹ãå ã§ããªãŒããŒãããŒæã«åžžã«äŸå€ãçºçããŸãã åæ§ã«ã2 ã€ã®æµ®åå°æ°ç¹ãä¹ç®ããŠããæç€ºçã«ãã§ãã¯ãããã³ã³ã¹ãã©ã¯ãå ã§ãã£ãŠãããªãŒããŒãããŒæã«äŸå€ãçºçããããšã¯ãããŸããã ããã«ãä»ã®æŒç®åã¯ãæ¢å®ãæç€ºçãã«é¢ä¿ãªãããã§ã㯠ã¢ãŒãã®åœ±é¿ãåããŸããã æ³šé
12.8.21 æ¢å®å€åŒ
ããã©ã«ãå€åŒã¯ãåã®ããã©ã«ãå€ (§9.3) ãååŸããããã«äœ¿çšãããŸãã
default_value_expression
: explicitly_typed_default
| default_literal
;
explicitly_typed_default
: 'default' '(' type ')'
;
default_literal
: 'default'
;
default_literal ã¯æ¢å®å€ (§9.3) ã衚ããŸãã åã¯ãããŸããããæ¢å®ã®ãªãã©ã«å€æ (§10.2.16) ã䜿çšããŠä»»æã®åã«å€æã§ããŸãã
default_value_expressionã®çµæã¯ãexplicitly_typed_defaultã®æç€ºçãªåã®æ¢å®å€ (§9.3)ããŸãã¯default_value_expressionã®å€æã®ã¿ãŒã²ããåã§ãã
åãæ¬¡ã®ããããã§ããå Žåã default_value_expression ã¯å®æ°åŒ (§12.26) ã§ãã
- åç §å
- åç §åãšããŠç¥ãããŠããåãã©ã¡ãŒã¿ãŒ (§8.2);
-
sbyteãbyteãshortãushortãintãuintãnintãnuintãlongãulongãcharãfloatãdoubleãdecimalãboolã - ããããåæåã
rvåã®åç
§å€æ°ãã£ãŒã«ãTã«ã¯ãdefaultã®æç€ºçãªåæååã¯å«ãŸããŸããã
泚:
rvã䜿çšããŠrv = defaultãåæåããããšãããšãåç §å€æ°ã¯nullã«èšå®ãããŸããã 代ããã«ãåTã®æ¢å®å€ãåç §ãã (ååšããªãå¯èœæ§ããã) åç §ã®å€ãèšå®ããããšããŸãã æ³šé
SãŸãã¯ã®å€ã§å¿
èŠãªã¡ã³ã㌠ãªã¹ã (default) ãæã€æ§é äœdefault(S)ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããå Žåãå¿
é ã¡ã³ããŒèšå®ã¯é©çšãããŸããã ãã ãããã©ã¡ãŒã¿ãŒãªãã®ã³ã³ã¹ãã©ã¯ã¿ãŒããªããæ¢å®ã®æ§é äœã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšnew S()å Žåã§ããSã§äœæãããã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠãã®ãããªèšå®ãé©çšãããŸãã
äŸ: 以äžã確èªããŠãã ããã
S v1 = default; // OK: no checking for required members S v2 = default(S); // OK: no checking for required members S v3 = new S(); // error: required member must be set S v4 = new S() { reqInt = default }; // OK: required member is set public struct S { public required int reqInt; }çµäºãµã³ãã«
12.8.22 ã¹ã¿ãã¯å²ãåœãŠ
ã¹ã¿ãã¯å²ãåœãŠåŒã¯ãå®è¡ã¹ã¿ãã¯ããã¡ã¢ãª ãããã¯ãå²ãåœãŠãŸãã å®è¡ã¹ã¿ã㯠ã¯ãããŒã«ã«å€æ°ãæ ŒçŽãããã¡ã¢ãªé åã§ãã å®è¡ã¹ã¿ãã¯ã¯ãããŒãžã ããŒãã®äžéšã§ã¯ãããŸããã ããŒã«ã«å€æ°ã¹ãã¬ãŒãžã«äœ¿çšãããã¡ã¢ãªã¯ãçŸåšã®é¢æ°ãæ»ã£ããšãã«èªåçã«å埩ãããŸãã
ã¹ã¿ãã¯å²ãåœãŠåŒã®å®å šãªã³ã³ããã¹ãèŠåã«ã€ããŠã¯ã §16.8.15.10 ãåç §ããŠãã ããã
stackalloc_expression
: 'stackalloc' unmanaged_type '[' expression ']'
| 'stackalloc' unmanaged_type? '[' constant_expression? ']' stackalloc_initializer
;
stackalloc_initializer
: '{' stackalloc_initializer_element_list '}'
;
stackalloc_initializer_element_list
: stackalloc_element_initializer (',' stackalloc_element_initializer)* ','?
;
stackalloc_element_initializer
: expression
;
unmanaged_type (§8.8) ã¯ãæ°ããå²ãåœãŠãããå Žæã«æ ŒçŽãããé
ç®ã®çš®é¡ã瀺ãã åŒ ã¯ãããã®é
ç®ã®æ°ã瀺ããŸãã ããããçµã¿åãããŠãå¿
èŠãªå²ãåœãŠãµã€ãºãæå®ããŸãã
åŒ ã®åã¯ã intåã«æé»çã«å€æã§ããå¿
èŠããããŸãã
ã¹ã¿ãã¯å²ãåœãŠã®ãµã€ãºãè² ã«ããããšã¯ã§ããŸãããããã¯ãè² ã®å€ã«è©äŸ¡ããã constant_expression ãšããŠé ç®ã®æ°ãæå®ããã³ã³ãã€ã«æãšã©ãŒã§ãã
å®è¡æã«å²ãåœãŠãããé
ç®ã®æ°ãè² ã®å€ã§ããå Žåãåäœã¯æªå®çŸ©ã§ãã 0 ã®å Žåãå²ãåœãŠã¯è¡ããããè¿ãããå€ã¯å®è£
å®çŸ©ã§ãã ã¡ã¢ãªãäžè¶³ããŠé
ç®ãå²ãåœãŠãããªãå Žåã¯ãSystem.StackOverflowException ãšã©ãŒãã¹ããŒãããŸãã
stackalloc_initializer ãååšããå Žå:
- unmanaged_typeãçç¥ãããšãstackalloc_element_initializerã®ã»ããã«å¯ŸããŠæãäžè¬çãªå (§12.6.3.17) ã®èŠåã«åŸã£ãŠæšè«ãããŸãã
- constant_expression ãçç¥ãããå Žåããã㯠stackalloc_element_initializeræ°ã§ãããšæšå®ãããŸãã
- constant_expression ãååšããå Žåããã㯠stackalloc_element_initializeræ°ã«çãããªããŸãã
å stackalloc_element_initializer ã¯ãunmanaged_type (§10.2) ãžã®æé»çãªå€æãæã€å¿ èŠããããŸãã stackalloc_element_initializerã¯ãå²ãåœãŠãããã¡ã¢ãªå ã®èŠçŽ ããã€ã³ããã¯ã¹ 0 ããå§ãŸãé ã«åæåããŸãã stackalloc_initializerããªãå Žåãæ°ããå²ãåœãŠãããã¡ã¢ãªã®å å®¹ã¯æªå®çŸ©ã§ãã
stackalloc_expressionãlocal_variable_declarationã®åæååŒ (§13.6.2) ãšããŠçŽæ¥çºçããlocal_variable_typeããã€ã³ã¿ãŒå (§24.3) ãŸãã¯æšè« (var) ã§ããå Žåãstackalloc_expressionã®çµæã¯T*å (§24.9) ã®ãã€ã³ã¿ãŒã«ãªããŸãã ãã®å Žåã stackalloc_expression ã¯å®å
šã§ãªãã³ãŒãã«è¡šç€ºãããå¿
èŠããããŸãã ãã以å€ã®å Žåã stackalloc_expression ã®çµæã¯ Span<T>åã®ã€ã³ã¹ã¿ã³ã¹ã«ãªããŸããããã§ã T 㯠unmanaged_typeã§ãã
-
Span<T>(§C.3) 㯠ref æ§é äœå (§16.2.3) ã§ããããã§ã¯ã stackalloc_expressionã«ãã£ãŠå²ãåœãŠããããããã¯ããåæå®ããã (T) é ç®ã®ã€ã³ããã¯ã¹å¯èœãªã³ã¬ã¯ã·ã§ã³ãšããŠã¡ã¢ãª ãããã¯ãæç€ºããŸãã - çµæã®
Lengthããããã£ã¯ãå²ãåœãŠãããé ç®ã®æ°ãè¿ããŸãã - çµæã®ã€ã³ãã¯ãµãŒ (§15.9) ã¯ãå²ãåœãŠããããããã¯ã®é ç®ã« variable_reference (§9.5) ãè¿ããç¯å²ããã§ãã¯ãããŸãã
ã¹ã¿ãã¯å²ãåœãŠåæååã¯ã catch ãããã¯ãŸã㯠finally ããã㯠(§13.11) ã§ã¯èš±å¯ãããŸããã
泚æ:
stackallocã䜿çšããŠå²ãåœãŠãããã¡ã¢ãªãæç€ºçã«è§£æŸããæ¹æ³ã¯ãããŸããã æ³šé
颿°ã¡ã³ããŒã®å®è¡äžã«äœæãããã¹ã¿ãã¯å²ãåœãŠã¡ã¢ãª ãããã¯ã¯ãã¹ãŠããã®é¢æ°ã¡ã³ããŒãæ»ã£ããšãã«èªåçã«ç Žæ£ãããŸãã
stackalloc æŒç®åãé€ããC# ã¯ã¬ããŒãž ã³ã¬ã¯ã·ã§ã³ãããŠããªãã¡ã¢ãªã管çããããã®å®çŸ©æžã¿ã®ã³ã³ã¹ãã©ã¯ããæäŸããŸããã ãã®ãããªãµãŒãã¹ã¯ãéåžžããµããŒã ã¯ã©ã¹ ã©ã€ãã©ãªã«ãã£ãŠæäŸãããããåºã«ãªããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ããçŽæ¥ã€ã³ããŒããããŸãã
äŸ:
// Memory uninitialized Span<int> span1 = stackalloc int[3]; // Memory initialized Span<int> span2 = stackalloc int[3] { -10, -15, -30 }; // Type int is inferred Span<int> span3 = stackalloc[] { 11, 12, 13 }; // Error; result is int*, not allowed in a safe context var span4 = stackalloc[] { 11, 12, 13 }; // Error; no conversion from Span<int> to Span<long> Span<long> span5 = stackalloc[] { 11, 12, 13 }; // Converts 11 and 13, and returns Span<long> Span<long> span6 = stackalloc[] { 11, 12L, 13 }; // Converts all and returns Span<long> Span<long> span7 = stackalloc long[] { 11, 12, 13 }; // Implicit conversion of Span<T> ReadOnlySpan<int> span8 = stackalloc int[] { 10, 22, 30 }; // Implicit conversion of Span<T> Widget<double> span9 = stackalloc double[] { 1.2, 5.6 }; public class Widget<T> { public static implicit operator Widget<T>(Span<double> sp) { return null; } }
span8ã®å Žåãstackallocã¯Span<int>ãçæãããããæé»çãªæŒç®åã«ãã£ãŠReadOnlySpan<int>ã«å€æãããŸãã åæ§ã«ãspan9ã®å Žåãçµæã®Span<double>ã¯ã次ã«ç€ºãããã«ã倿ã䜿çšããŠãŠãŒã¶ãŒå®çŸ©åWidget<double>ã«å€æãããŸãã çµäºãµã³ãã«
12.8.23 nameof æŒç®å
nameof_expression ã¯ãããã°ã©ã ãšã³ãã£ãã£ã®ååã宿°æååãšããŠååŸããããã«äœ¿çšãããŸãã
nameof_expression
: 'nameof' '(' named_entity ')'
;
named_entity
: named_entity_target ('.' identifier type_argument_list?)*
;
named_entity_target
: simple_name
| 'this'
| 'base'
| predefined_type
| qualified_alias_member
;
nameof ã¯ããŒã¯ãŒãã§ã¯ãªãããã nameof_expression ã¯åžžã«æ§æçã«ãããŸãã§ãããåçŽãªåå nameofã®åŒã³åºãã«ãã£ãŠãããŸãã«ãªããŸãã äºææ§äžã®çç±ãããåå ã®ååæ€çŽ¢ (nameof) ãæåããå ŽåãåŒã³åºããæå¹ãã©ããã«é¢ä¿ãªããåŒã¯ invocation_expression ãšããŠæ±ãããŸãã ãã以å€ã®å Žå㯠nameof_expressionã§ãã
åçŽãªååãšã¡ã³ã㌠ã¢ã¯ã»ã¹ã®æ€çŽ¢ã¯ãã³ã³ãã€ã«æã« named_entity ã«å¯ŸããŠã §12.8.4 ãã㳠§12.8.7 ã§èª¬æãããŠããèŠåã«åŸã£ãŠå®è¡ãããŸãã ãã ãã §12.8.4 ãã㳠§12.8.7 ã§èª¬æãããŠããæ€çŽ¢ã§ã¯ãéçã³ã³ããã¹ãã§ã€ã³ã¹ã¿ã³ã¹ ã¡ã³ããŒãèŠã€ãã£ãããããšã©ãŒãçºçããŸããã nameof_expression ã¯ãã®ãããªãšã©ãŒãçæããŸããã
named_entity ãã¡ãœãã ã°ã«ãŒããæå®ããtype_argument_listãæã€å Žåãã³ã³ãã€ã«æãšã©ãŒã«ãªããŸãã
named_entity_target ã dynamicåãæã€ããšã¯ã³ã³ãã€ã«æãšã©ãŒãšãªããŸãã
nameof_expression 㯠stringåã®å®æ°åŒã§ãããå®è¡æã«ã¯åœ±é¿ããŸããã å
·äœçã«ã¯ããã® named_entity ã¯è©äŸ¡ããããæç¢ºãªä»£å
¥åæ (§9.4.4.22) ã§ã¯ç¡èŠãããŸãã ãã®å€ã¯ããªãã·ã§ã³ã®æçµ type_argument_list ã®åã® named_entityã®æåŸã®èå¥åã§ãããæ¬¡ã®ããã«å€æãããŸãã
- ãã¬ãã£ãã¯ã¹ "
@"(䜿çšãããŠããå Žå) ã¯åé€ãããŸãã - å unicode_escape_sequence ã¯ã察å¿ãã Unicode æåã«å€æãããŸãã
- ãã¹ãŠã® formatting_characters ãåé€ãããŸãã
ãããã¯ãèå¥åéã®ç䟡æ§ããã¹ããããšãã«ã §6.4.3 ã§é©çšãããã®ãšåã倿ã§ãã
äŸã®:
nameofåå空éå ã§å®£èšããããžã§ããªãã¯åList<T>ãæ³å®ãããããŸããŸãªSystem.Collections.GenericåŒã®çµæã次ã«ç€ºããŸããusing TestAlias = System.String; class Program { static void Main() { var point = (x: 3, y: 4); string n1 = nameof(System); // "System" string n2 = nameof(System.Collections.Generic); // "Generic" string n3 = nameof(point); // "point" string n4 = nameof(point.x); // "x" string n5 = nameof(Program); // "Program" string n6 = nameof(System.Int32); // "Int32" string n7 = nameof(TestAlias); // "TestAlias" string n8 = nameof(List<int>); // "List" string n9 = nameof(Program.InstanceMethod); // "InstanceMethod" string n10 = nameof(Program.GenericMethod); // "GenericMethod" string n11 = nameof(Program.NestedClass); // "NestedClass" // Invalid // string x1 = nameof(List<>); // Empty type argument list // string x2 = nameof(List<T>); // T is not in scope // string x3 = nameof(GenericMethod<>); // Empty type argument list // string x4 = nameof(GenericMethod<T>); // T is not in scope // string x5 = nameof(int); // Keywords not permitted // Type arguments not permitted for method group // string x6 = nameof(GenericMethod<Program>); } void InstanceMethod() { } void GenericMethod<T>() { string n1 = nameof(List<T>); // "List" string n2 = nameof(T); // "T" } class NestedClass { } }ãã®äŸã®é©ãã¹ãéšåã¯ãå®å šãªåå空éã§ã¯ãªã "ãžã§ããªãã¯" ã«
nameof(System.Collections.Generic)ã解決ãã"String" ã§ã¯ãªã "TestAlias" ã«nameof(TestAlias)ããããšã§ãã çµäºãµã³ãã«
12.8.24 å¿åã¡ãœããåŒ
anonymous_method_expression ã¯ãå¿å颿°ãå®çŸ©ãã 2 ã€ã®æ¹æ³ã® 1 ã€ã§ãã ãããã¯Â§ 12.22ã§ããã«èª¬æãããŠããŸãã
12.8.25 ã³ã¬ã¯ã·ã§ã³åŒ
ã³ã¬ã¯ã·ã§ã³åŒã¯ã[]åºåãã®ã³ã³ãåºåãã® 0 å以äžã®collection_elementã»ããã§ã1ã€ã®ã³ã¬ã¯ã·ã§ã³ãäžç·ã«è¡šããŸãã
collection_expression
: '[' (collection_element (',' collection_element)*)? ']'
;
collection_element
: expression_element
| spread_element
;
expression_element
: expression
;
spread_element
: '..' expression
;
ããèªäœã§ã¯ã collection_expression ã«ã¯åããããŸãããããããã¿ãŒã²ããåã§ããã€ãŸãã䜿çšãããã³ã³ããã¹ãã«å¿ããŠã(§10.2.22) ãã¿ãŒã²ããã®åã«å€æãããŸã (ãã®ãããªå€æãèš±å¯ãããŠããããšãåæãšããŠããŸã)ã
collection_initializer (§12.8.17.2.3) ããµããŒãããåã¯ãcollection_expressionã®ã¿ãŒã²ããåã«ããããšãã§ããŸãã
CollectionBuilderAttributeã§æå®ãããåã¯ãã¿ãŒã²ããå (§15.17.1) ã§ãããŸããŸããã
collection_elementã®åŒã¯å®æ°ã§ããå¿ èŠã¯ãããŸããã collection_expressionã¯ããã¹ãŠã®collection_elementãååšããå Žåã§ããã³ã³ãã€ã«æå®æ°ã§ã¯ãããŸããã
äŸ:
string[] colors = ["red", "white", "blue"]; // initialization List<int> counts = [10, 25, 45, 67]; Span<double> list = [5.4, 3.9F, 123, 'x']; ReadOnlySpan<object> items = [counts[2], 19.5, 'X', colors[1]]; int v = ((int[])[10, 20])[1]; // explicit target type cast
colorsã®å Žåãã³ã¬ã¯ã·ã§ã³åŒã¯ãLength3 ãæã€string[]ã«å€æãããŸããcountsã®å Žåãã³ã¬ã¯ã·ã§ã³åŒã¯ãCount4 ã®List<int>ã«å€æãããŸããlistã®å Žåãã³ã¬ã¯ã·ã§ã³åŒã¯Length4 ã®Span<double>ã«å€æãããåŒã¯å¿ èŠã«å¿ããŠæé»çã«doubleã«å€æãããŸããitemsã®å Žåãã³ã¬ã¯ã·ã§ã³åŒã¯Length4 ã®ReadOnlySpan<object>ã«å€æãããåŒã¯ããã¯ã¹åãããŸãã çµäºãµã³ãã«
collection_expression[]ã¯ç©ºã®ã³ã¬ã¯ã·ã§ã³ã衚ããŸãã ãã®ãããªåŒã倿ãããšãã³ã¬ã¯ã·ã§ã³ã®CountãŸãã¯Lengthã 0 ã«ãªããŸããããããã£isEmptytrueãè¿ãããŸãã
spread_elementã«ãããåŒã«ãã£ãŠæå®ãããcollection_elementã®ã»ãããããã®spread_elementã®å Žæããæ°ããã³ã¬ã¯ã·ã§ã³ã«ã³ããŒãããŸãã
åŒ ã¯ã foreach ã¹ããŒãã¡ã³ãã䜿çšããŠåæå¯èœãªãšã³ãã£ãã£ãæå®ããå¿
èŠããããŸãã
äŸ:
string[] colors1 = ["red", "white", "blue"]; string[] colors2 = ["black", .. colors1, "yellow"]; List<string> directions = ["north", "south", "east", "west"]; Span<string> words = ["March", .. colors1, "Hello",.. directions]; ReadOnlySpan<object> things = [123, 10.5, .. directions]; int[] counts = [10, 20, 30]; List<double> values = [1.2, 3.5]; Span<ValueType> numbers = [.. counts, .. values];
colors2ã«ã¯ã"black"ã"red"ã"white"ã"blue"ã"yellow"ã® 5 ã€ã®èŠçŽ ãå«ãŸããŠããŸããwordsã¯ãstringåã® 2 ã€ã®èŠçŽ ã«å ããŠãstring[]ãšList<string>ã®ãã¹ãŠã®èŠçŽ ããã瀺ãããŠããé åºã§äœæãããŸããthingsã¯ãintãdoubleãããã³List<string>ã®ãã¹ãŠã®èŠçŽ ããäœæãããŸãã æ¬¡ã«ç€ºãããã«ãã³ã¬ã¯ã·ã§ã³ã®ã³ããŒå ã®ã³ã³ãããŒã®åã¯éèŠã§ã¯ãããŸããã ãŸããnumbersã®å ŽåãèŠçŽ ã®åã¯åãã§ããå¿ èŠã¯ãããŸããã çµäºãµã³ãã«
spread_elementå
ã®åŒã[]ãããŠããå Žåããã®spread_elementã¯ç¡èŠãããå¯èœæ§ããããŸããèŠçŽ ã¯å«ãŸãªãããã§ãã
12.9 åé æŒç®å
12.9.1 å šè¬
+ã-ã! (è«çåŠå® §12.9.4 ã®ã¿)ã~ã^ã++ã--ããã£ã¹ããããã³awaitæŒç®åã¯åé
æŒç®åãšåŒã°ããŸãã
泚æ: ã³ã³ãã€ã«æãšãªãŒããŒããŒãã§ããªãã ãã®æ§è³ªã®ãããåŸçœ® null 蚱容æŒç®å (§12.8.9)
!ã¯ãäžèšã®äžèЧããé€å€ãããŸãã æ³šé
unary_expression
: primary_expression
| '+' unary_expression
| '-' unary_expression
| logical_negation_operator unary_expression
| '~' unary_expression
| '^' unary_expression
| pre_increment_expression
| pre_decrement_expression
| cast_expression
| await_expression
| pointer_indirection_expression // unsafe code support
| addressof_expression // unsafe code support
;
pointer_indirection_expression (§24.6.2) ãš addressof_expression (§24.6.5) ã¯ãå®å šã§ãªãã³ãŒã (§24) ã§ã®ã¿äœ¿çšã§ããŸãã
unary_expression ã®ãªãã©ã³ãã«ã³ã³ãã€ã«æã®å dynamicãããå Žåã¯ãåçã«ãã€ã³ããããŸã (§12.3.3)ã ãã®å Žåãæ¬¡ã®ããã«ãªããŸãã
-
unary_expressionã®ã³ã³ãã€ã«æã®åã¯æ¬¡ã®ãšããã§ãã
-
Index^ã€ã³ããã¯ã¹ã® from-end æŒç®å (§12.9.6) ã®å Žå -
dynamicä»ã®ãã¹ãŠã®åé æŒç®åã®å ŽåããããŠ
-
- 以äžã§èª¬æãã解決ã¯ããªãã©ã³ãã®å®è¡æåã䜿çšããŠå®è¡æã«è¡ãããŸãã
12.9.2 åé ãã©ã¹æŒç®å
ãã©ãŒã +x ã®æŒç®ã§ã¯ãåé
æŒç®åã®ãªãŒããŒããŒã解決 (§12.4.5) ãé©çšãããç¹å®ã®æŒç®åã®å®è£
ãéžæãããŸãã ãªãã©ã³ãã¯éžæããæŒç®åã®ãã©ã¡ãŒã¿ãŒåã«å€æãããçµæã®åã¯æŒç®åã®æ»ãå€ã®åã«ãªããŸãã å®çŸ©æžã¿ã®åé
ãã©ã¹æŒç®åã¯æ¬¡ã®ãšããã§ãã
int operator +(int x);
uint operator +(uint x);
nint operator +(nint x);
nuint operator +(nuint x);
long operator +(long x);
ulong operator +(ulong x);
float operator +(float x);
double operator +(double x);
decimal operator +(decimal x);
ãããã®æŒç®åããšã«ãçµæã¯ãªãã©ã³ãã®å€ã«ãããŸããã
äžèšã§å®çŸ©ãããæªãªããã®èŠå®æžã¿åé ãã©ã¹æŒç®åã®ãªããåœ¢åŒ (§12.4.8) ãèŠå®ãããŠããŸãã
12.9.3 åé ãã€ãã¹æŒç®å
ãã©ãŒã -x ã®æŒç®ã§ã¯ãåé
æŒç®åã®ãªãŒããŒããŒã解決 (§12.4.5) ãé©çšãããç¹å®ã®æŒç®åã®å®è£
ãéžæãããŸãã ãªãã©ã³ãã¯éžæããæŒç®åã®ãã©ã¡ãŒã¿ãŒåã«å€æãããçµæã®åã¯æŒç®åã®æ»ãå€ã®åã«ãªããŸãã å®çŸ©æžã¿ã®åé
ãã€ãã¹æŒç®åã¯æ¬¡ã®ãšããã§ãã
æŽæ°åŠå®:
int operator -(int x); nint operator -(nint x); long operator -(long x);çµæã¯ã0 ãã
Xãæžç®ããããšã«ãã£ãŠèšç®ãããŸããXã®å€ããªãã©ã³ãåã®æå°è¡šçŸå¯èœãªå€ (intã®å Žåã¯â2 ²¹ãnintã®å Žåã¯å¯Ÿå¿ããå€ããŸãã¯longã®å Žå㯠â2ⶠ²) ã®å ŽåãXã®æ°åŠçåŠå®ã¯ãªãã©ã³ãåå ã§è¡šãããŸããã ãããcheckedã³ã³ããã¹ãå ã§çºçããå Žåã¯ãSystem.OverflowExceptionãã¹ããŒãããŸããuncheckedã³ã³ããã¹ãå ã§çºçããå Žåãçµæã¯ãªãã©ã³ãã®å€ã«ãªãããªãŒããŒãããŒã¯å ±åãããŸãããåŠå®æŒç®åã®ãªãã©ã³ãã
uintåã®å Žåã¯ãålongã«å€æãããçµæã®åã¯longã§ãã äŸå€ã¯ãintå€â2147483648(â2 ²¹) ã 10 鲿޿°ãªãã©ã« (§6.4.5.3) ãšããŠæžã蟌ãããšãèš±å¯ãããèŠåã§ããåŠå®æŒç®åã®ãªãã©ã³ãã
nuintåã®å Žåãã³ã³ãã€ã«æãšã©ãŒãçºçããŸããåŠå®æŒç®åã®ãªãã©ã³ãã
ulongåã®å Žåãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã äŸå€ã¯ãlongå€â9223372036854775808(â2 â¶Â³) ã 10 鲿޿°ãªãã©ã« (§6.4.5.3) ãšããŠæžã蟌ãããšãèš±å¯ãããèŠåã§ããæµ®åå°æ°ç¹åŠå®:
float operator -(float x); double operator -(double x);çµæã¯ã笊å·ãå転ããã
Xã®å€ã«ãªããŸããxãNaNã®å ŽåãçµæãNaNã§ãã10鲿°ã®åŠå®
decimal operator -(decimal x);çµæã¯ã0 ãã
Xãæžç®ããããšã«ãã£ãŠèšç®ãããŸãã 10 鲿°ã®åŠå®ã¯ãSystem.Decimalåã®åé ãã€ãã¹æŒç®åã䜿çšããããšãšåãã§ãã
äžã§å®çŸ©ããããªãããããŠããªãå®çŸ©æžã¿åé ãã€ãã¹æŒç®åã®åœ¢åŒã«å ããŠããªããããã圢åŒãäºåã«å®çŸ©ãããŠããŸã (§12.4.8)ã
12.9.4 è«çåŠå®æŒç®å
ãã©ãŒã !x ã®æŒç®ã§ã¯ãåé
æŒç®åã®ãªãŒããŒããŒã解決 (§12.4.5) ãé©çšãããç¹å®ã®æŒç®åã®å®è£
ãéžæãããŸãã ãªãã©ã³ãã¯éžæããæŒç®åã®ãã©ã¡ãŒã¿ãŒåã«å€æãããçµæã®åã¯æŒç®åã®æ»ãå€ã®åã«ãªããŸãã å®çŸ©æžã¿ã®è«çåŠå®æŒç®åã 1 ã€ã ãååšããŸãã
bool operator !(bool x);
ãã®æŒç®åã¯ããªãã©ã³ãã®è«çåŠå®ãèšç®ããŸãããªãã©ã³ãã trueã§ããå Žåãçµæã¯ falseã§ãã ãªãã©ã³ãã false ã®å Žåãçµæã¯ true ã«ãªããŸãã
äžèšã§å®çŸ©ãããŠãããªããè§£é€ãããäºåå®çŸ©æžã¿è«çåŠå®æŒç®åã®ãªãã (§12.4.8) 圢åŒãäºåå®çŸ©ãããŠããŸãã
泚: æ¥é è«çåŠå®æŒç®åãšæ¥å°Ÿnull蚱容æŒç®å(§12.8.9)ã¯ãåãèªåœããŒã¯ã³(!)ã§è¡šãããŸãããç°ãªããã®ã§ãã
泚é
12.9.5 ãããããšã®è£æ°æŒç®å
ãã©ãŒã ~x ã®æŒç®ã§ã¯ãåé
æŒç®åã®ãªãŒããŒããŒã解決 (§12.4.5) ãé©çšãããç¹å®ã®æŒç®åã®å®è£
ãéžæãããŸãã ãªãã©ã³ãã¯éžæããæŒç®åã®ãã©ã¡ãŒã¿ãŒåã«å€æãããçµæã®åã¯æŒç®åã®æ»ãå€ã®åã«ãªããŸãã å®çŸ©æžã¿ã®ãããããšã®è£æ°æŒç®åã¯æ¬¡ã®ãšããã§ãã
int operator ~(int x);
uint operator ~(uint x);
nint operator ~(nint x);
nuint operator ~(nuint x);
long operator ~(long x);
ulong operator ~(ulong x);
ãããã®æŒç®åã®ããããã«ã€ããŠãæŒç®ã®çµæã¯ã xã®ãããããšã®è£æ°ã§ãã
ãã¹ãŠã®åæå E ã§ã¯ã次ã®ãããããšã®è£æ°æŒç®åãæé»çã«æäŸãããŸãã
E operator ~(E x);
~xãè©äŸ¡ããçµæ (X ã¯åºã«ãªãå Eãæã€åæå U ã®åŒ) ã¯ã (E)(~(U)x)ã®è©äŸ¡ãšãŸã£ããåãã§ããã E ãžã®å€æã¯åžžã« unchecked ã³ã³ããã¹ã (§12.8.20) ã®ããã«å®è¡ãããŸãã
äžèšã§å®çŸ©ãããŠããæªãªããã®å®çŸ©æžã¿ãããããšã®è£æ°æŒç®åã®ãªãã (§12.4.8) 圢åŒãäºåå®çŸ©ãããŠããŸãã
12.9.6 Index from-end æŒç®å
åé
^ æŒç®åã¯ã ã€ã³ããã¯ã¹ã® from-end æŒç®å (å£èªçã«ã¯ åžœåæŒç®åãšåŒã°ããŸã) ãšåŒã°ããŸãã ãã®æŒç®åã¯ãªãŒããŒããŒãã§ãã (§12.4.3)ãå®çŸ©æžã¿ã®æŒç®åã 1 ã€ãããŸãã
Index operator ^(int x);
ãã©ãŒã ^x ã®æŒç®ã®çµæã¯ãåŒã®çµæãšç䟡㪠from-end Index (§18.2) å€ã«ãªããŸãã
new Index(x, true)
ä»ã® unary_expressionãšåæ§ã«ããªãã©ã³ãã¯ã³ã³ãã€ã«æã®å dynamic (§12.9.1) ãæã¡ãåçã«ãã€ã³ããããå¯èœæ§ããããŸã (§12.3.3)ã çµæã®ã³ã³ãã€ã«æã®åã¯åžžã« Indexã
ã€ã³ããã¯ã¹ã® from-end æŒç®åã®ãªããããã (§12.4.8) 圢åŒãäºåã«å®çŸ©ãããŠããŸãã
12.9.7 ãã¬ãã£ãã¯ã¹ã€ã³ã¯ãªã¡ã³ãæŒç®åãšãã¯ãªã¡ã³ãæŒç®å
pre_increment_expression
: '++' unary_expression
;
pre_decrement_expression
: '--' unary_expression
;
å眮ã€ã³ã¯ãªã¡ã³ããŸãã¯ãã¯ãªã¡ã³ãæŒç®ã®ãªãã©ã³ãã¯ã倿°ããããã㣠ã¢ã¯ã»ã¹ããŸãã¯ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ãšããŠåé¡ãããåŒã§ãªããã°ãªããŸããã æŒç®ã®çµæã¯ãªãã©ã³ããšåãåã®å€ã«ãªããŸãã
ãã¬ãã£ãã¯ã¹ã€ã³ã¯ãªã¡ã³ããŸãã¯ãã¯ãªã¡ã³ãæŒç®ã®ãªãã©ã³ããããããã£ãŸãã¯ã€ã³ãã¯ãµãŒã¢ã¯ã»ã¹ã§ããå Žåãããããã£ãŸãã¯ã€ã³ãã¯ãµãŒã¯ãget ã¢ã¯ã»ãµãŒãš set ã¢ã¯ã»ãµãŒãŸã㯠init ã¢ã¯ã»ãµãŒã®äž¡æ¹ãæã€å¿ èŠããããŸãã ããã§ãªãå Žåã¯ããã€ã³ãæãšã©ãŒãçºçããŸãã
åé
æŒç®åã®ãªãŒããŒããŒã解決(§12.4.4)ã¯ãç¹å®ã®æŒç®åã®å®è£
ãéžæããããã«é©çšãããŸãã å®çŸ©æžã¿ã® ++ æŒç®åãš -- æŒç®åã¯ã sbyteã byteã shortã ushortã intã uintã nintã nuintã longã ulongã charã floatdoubleã decimalãä»»æã®åæåã«å¯ŸããŠååšããŸãã å®çŸ©æžã¿ã® ++ æŒç®åã¯ããªãã©ã³ãã« 1 ã远å ããããšã«ãã£ãŠçæãããå€ãè¿ããå®çŸ©æžã¿ã® -- æŒç®åã¯ããªãã©ã³ããã 1 ãæžç®ããããšã«ãã£ãŠçæãããå€ãè¿ããŸãã
checked ã³ã³ããã¹ãã§ã¯ããã®å ç®ãŸãã¯æžç®ã®çµæãçµæåã®ç¯å²å€ã§ãçµæã®åãæŽæ°åãŸãã¯åæåã®å Žåã System.OverflowException ãã¹ããŒãããŸãã
éžæããåé æŒç®åã®æ»ãå€ã®åãã unary_expressionã®åãžã®æé»çãªå€æãå¿ èŠã§ãããã以å€ã®å Žåã¯ãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
ãã©ãŒã ++x ãŸã㯠--x ã®å眮ã€ã³ã¯ãªã¡ã³ããŸãã¯ãã¯ãªã¡ã³ãæŒç®ã®å®è¡æåŠçã¯ãæ¬¡ã®æé ã§æ§æãããŸãã
-
xã倿°ãšããŠåé¡ãããå Žå:-
xã¯ã倿°ãçæããããã«è©äŸ¡ãããŸãã -
xã®å€ã¯éžæãããæŒç®åã®ãªãã©ã³ãåã«å€æããããã®å€ãåŒæ°ãšããŠæŒç®åãåŒã³åºãããŸãã - æŒç®åã«ãã£ãŠè¿ãããå€ã¯ã
xã®åã«å€æãããŸãã çµæã®å€ã¯ãxã®è©äŸ¡ã«ãã£ãŠæå®ãããå Žæã«æ ŒçŽãããæäœã®çµæã«ãªããŸãã
-
-
xãããããã£ãŸãã¯ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ãšããŠåé¡ãããå Žå:- ã€ã³ã¹ã¿ã³ã¹åŒ (
xãstaticãããŠããªãå Žå) ãšãxã«é¢é£ä»ããããŠããåŒæ°ãªã¹ã (xãã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã®å Žå) ãè©äŸ¡ããããã®çµæã¯åŸç¶ã® get ããã³ set ãŸã㯠init ã¢ã¯ã»ãµãŒåŒã³åºãã§äœ¿çšãããŸãã -
xã® get ã¢ã¯ã»ãµãŒãåŒã³åºãããŸãã - get ã¢ã¯ã»ãµãŒã«ãã£ãŠè¿ãããå€ã¯ãéžæãããæŒç®åã®ãªãã©ã³ãåã«å€æããããã®å€ãåŒæ°ãšããŠæŒç®åãåŒã³åºãããŸãã
- æŒç®åã«ãã£ãŠè¿ãããå€ã¯ã
xã®åã«å€æãããŸããxã® set ã¢ã¯ã»ãµãŒãŸã㯠init ã¢ã¯ã»ãµãŒã¯ããã®å€ãå€åŒæ°ãšããŠäœ¿çšããŠåŒã³åºãããŸãã - ãã®å€ã¯ãæŒç®ã®çµæã«ããªããŸãã
- ã€ã³ã¹ã¿ã³ã¹åŒ (
++ ããã³ -- æŒç®åã¯ããã¹ããã£ãã¯ã¹è¡šèš (§12.9.6) ããµããŒãããŠããŸãã
x++ ãŸã㯠x-- ã®çµæã¯æŒç®åã® x ã®å€ã§ããã ++x ãŸã㯠--x ã®çµæã¯æŒç®åŸã® x ã®å€ã§ãã ã©ã¡ãã®å Žåãã x èªäœã¯æŒç®åŸã«åãå€ãæã¡ãŸãã
æŒç®å ++ ãŸãã¯æŒç®å -- å®è£
ã¯ãåŸçœ®è¡šèšãŸãã¯ãã¬ãã£ãã¯ã¹è¡šèšã䜿çšããŠåŒã³åºãããšãã§ããŸãã 2 ã€ã®è¡šèšã«å¯ŸããŠåå¥ã®æŒç®åãå®è£
ããããšã¯ã§ããŸããã
äžèšã§å®çŸ©ãããŠãããªããè§£é€ãããå®çŸ©æžã¿ã®ãã¬ãã£ãã¯ã¹ ã€ã³ã¯ãªã¡ã³ãæŒç®åãšãã¯ãªã¡ã³ãæŒç®åã®ãªãã (§12.4.8) 圢åŒãäºåå®çŸ©ãããŠããŸãã
12.9.8 ãã£ã¹ãåŒ
åŒãæç€ºçã«ç¹å®ã®åã«å€æããã«ã¯ã cast_expression ã䜿çšããŸãã
cast_expression
: '(' type ')' unary_expression
;
cast_expression ã®åœ¢åŒ (T)E ã«ãããŠãT ã¯åã§ãããE 㯠unary_expression ã«çžåœããŸããããã¯ã ã®å€ãæç€ºçã«å€æã㊠E ã®åã«å€ããæç¶ãã§ãïŒTïŒã æ¡ä»¶åŒå€æ (§10.2.20) ã®å Žåã E ãã Tãžã®å€æãè€æ°ååšããå¯èœæ§ããããŸãããã®å Žåãæ¡ä»¶åŒå€æã¯æåŸã®ææ®µãšããŠã®ã¿äœ¿çšãããŸãã
E ãã Tãžã®æç€ºçãªå€æãååšããªãå Žåã¯ããã€ã³ãæãšã©ãŒãçºçããŸãã ãã以å€ã®å Žåãæç€ºçãªå€æã«ãã£ãŠçæãããå€ãçµæã«ãªããŸãã
E ã倿°ã衚ããŠããå Žåã§ããçµæã¯åžžã«å€ãšããŠåé¡ãããŸãã
cast_expression ã®ææ³ã¯ãç¹å®ã®æ§æã®ãããŸããã«ã€ãªãããŸãã
äŸ: åŒ
(x)âyã¯ã cast_expression (âyããåxãžã®ãã£ã¹ã) ãšããŠè§£éããããšãã parenthesized_expression (å€ ãèšç®ãã) ãšçµã¿åãããx â yãšããŠè§£éããããšãã§ããŸãã çµäºãµã³ãã«
cast_expression ã®ãããŸããã解決ããããã«ã次ã®èŠåãååšããŸãããã£ãã§å²ãŸãã 1 ã€ä»¥äžã®ããŒã¯ã³ (§6.4) ã®ã·ãŒã±ã³ã¹ã¯ã次ã®å°ãªããšã 1 ã€ã該åœããå Žåã«ã®ã¿ã cast_expression ã®éå§ãšèŠãªãããŸãã
- ããŒã¯ã³ã®ã·ãŒã±ã³ã¹ã¯åã«å¯ŸããŠæ£ããææ³ã§ãããåŒã«ã¯é©ããŠããŸããã
- ããŒã¯ã³ã®ã·ãŒã±ã³ã¹ã¯åã®æ£ããææ³ã§ãããéããã£ãã®ããåŸã®ããŒã¯ã³ã¯ããŒã¯ã³ "
~"ãããŒã¯ã³ "!"ãããŒã¯ã³ "("ãèå¥å (§6.4.3)ããªãã©ã« (§6.4.5)ããŸãã¯ããŒã¯ãŒã (§6.4.4) ã®ãããã (asããã³isãé€ã) ã§ãã
äžèšã® "æ£ããææ³" ãšããçšèªã¯ãããŒã¯ã³ã®ã·ãŒã±ã³ã¹ãç¹å®ã®ææ³ã®çæã«æºæ ããå¿ èŠãããããšãæå³ããŸãã å ·äœçã«ã¯ãæ§æèå¥åã®å®éã®æå³ã¯èæ ®ãããŸããã
äŸ:
xãšyãèå¥åã®å Žåãx.yãå®éã«åã衚ããŠããªãå Žåã§ããx.yã¯åã®æ£ããææ³ã«ãªããŸãã çµäºãµã³ãã«
泚æ: éæ±ºå®èŠåããã
xãšyãèå¥åã§ããå Žåã(x)yã(x)(y)ãããã³(x)(-y)㯠cast_expressionã§ãããããšã(x)-yãåãèå¥ããå Žåã§ããxã¯ããã§ã¯ãããŸããã ãã ããxãå®çŸ©æžã¿ã®å (intãªã©) ãèå¥ããããŒã¯ãŒãã§ããå Žåããã® 4 ã€ã®åœ¢åŒã¯ãã¹ãŠ ãã£ã¹ãåŒãšãããŠããŸãïŒãã®ãããªããŒã¯ãŒããåç¬ã§åŒãšããŠæ±ãããšã¯ã§ããªãããã§ãïŒã 泚é
12.9.9 åŒã®åŸ æ©
12.9.9.1 å šè¬
await æŒç®åã¯ããªãã©ã³ãã§è¡šãããéåææäœãå®äºãããŸã§ãå²ãããéåæé¢æ°ã®è©äŸ¡ãäžæããããã«äœ¿çšãããŸãã
await_expression
: 'await' unary_expression
;
await_expressionã¯ãéåæé¢æ° (§15.14) ã®æ¬äœã§ã®ã¿äœ¿çšã§ããŸãã æãè¿ãå²ãããéåæé¢æ°å ã§ã¯ãawait_expression ã¯ããããã®å Žæã§ã¯çºçããŸããã
- ãã¹ãããã (éåæ) å¿å颿°å
- lock_statement ã®ãããã¯å
- å¿å颿°ãåŒæšåã«å€æããå Žå (§10.7.3)
- å®å šã§ãªãã³ã³ããã¹ãã®å Žå
泚: await_expression ã¯ãéåæã§ãªãã©ã ãåŒã䜿çšããããã«æ§æçã«å€æããããããquery_expressionå ã®ã»ãšãã©ã®å Žæã§ã¯çºçããŸããã æ³šé
éåæé¢æ°å
ã§ã¯ã await 㯠available_identifier ãšããŠäœ¿çšãããŸããããéèªçãªèå¥å @await 䜿çšã§ããŸãã ãããã£ãŠã await_expressionãšèå¥åãå«ãããŸããŸãªåŒã®éã«æ§æçãªãããŸããã¯ãããŸããã éåæé¢æ°ã®å€éšã§ã¯ã await ã¯éåžžã®èå¥åãšããŠæ©èœããŸãã
await_expression ã®ãªãã©ã³ãã¯ãã¿ã¹ã¯ãšåŒã°ããŠããŸãã
ããã¯ãawait_expressionã®è©äŸ¡æã«å®äºããå Žåãšå®äºããªãå¯èœæ§ãããéåææäœã衚ããŸãã
await æŒç®åã®ç®çã¯ãåŸ
æ©äžã®ã¿ã¹ã¯ãå®äºãããŸã§å€åŽã®éåæé¢æ°ã®å®è¡ãäžæãããã®çµæãååŸããããšã§ãã
12.9.9.2 Awaitable åŒ
await_expression ã®ã¿ã¹ã¯ã¯ãåŸ
æ©å¯èœãªã§ããå¿
èŠããããŸãã æ¬¡ã®ããããã該åœããå ŽåãåŒ t ã¯åŸ
æ©ã§ããŸãã
-
tã¯ã³ã³ãã€ã«æã®ådynamic -
tã«ã¯ããã©ã¡ãŒã¿ãŒãšåãã©ã¡ãŒã¿ãŒãæããªãGetAwaiterãšåŒã°ããã¢ã¯ã»ã¹å¯èœãªã€ã³ã¹ã¿ã³ã¹ãŸãã¯æ¡åŒµã¡ãœãããšã次ã®ãã¹ãŠãä¿æããæ»ãå€ã®åAããããŸãã-
Aã¯ãã€ã³ã¿ãŒãã§ã€ã¹System.Runtime.CompilerServices.INotifyCompletionãå®è£ ããŸã (以äžãç°¡æœã«ããããã«INotifyCompletionãšåŒã°ããŸã)ã -
Aã«ã¯ãã¿ã€ãIsCompletedã®ãã¢ã¯ã»ã¹å¯èœã§èªã¿åãå¯èœãªã€ã³ã¹ã¿ã³ã¹ããããã£boolãããã -
Aã«ã¯ããã©ã¡ãŒã¿ãŒãåãã©ã¡ãŒã¿ãŒãå«ãŸãªããã¢ã¯ã»ã¹å¯èœãªã€ã³ã¹ã¿ã³ã¹ ã¡ãœããGetResultããããŸã
-
GetAwaiter ã¡ãœããã®ç®çã¯ãã¿ã¹ã¯ã® awaiter ãååŸããããšã§ãã å A ã¯ãawait åŒã§ãawaiter åãšåŒã°ããŸãã
IsCompleted ããããã£ã®ç®çã¯ãã¿ã¹ã¯ãæ¢ã«å®äºããŠãããã©ããã倿ããããšã§ãã ãã®å Žåãè©äŸ¡ãäžæããå¿
èŠã¯ãããŸããã
INotifyCompletion.OnCompleted ã¡ãœããã®ç®çã¯ãã¿ã¹ã¯ãå®äºãããšåŒã³åºããããç¶ç¶ãã®ããªã²ãŒãïŒSystem.ActionåïŒãã¿ã¹ã¯ã«ç»é²ããããšã§ãã
GetResult ã¡ãœããã®ç®çã¯ãå®äºããã¿ã¹ã¯ã®çµæãååŸããããšã§ãã ãã®çµæã¯ãæ£åžžã«å®äºãçµæå€ãæã€å Žåãããã°ãGetResult ã¡ãœããã«ãã£ãŠã¹ããŒãããäŸå€ã§ããå ŽåããããŸãã
12.9.9.3 await åŒã®åé¡
åŒ await t ã¯ãåŒ (t).GetAwaiter().GetResult()ãšåãããã«åé¡ãããŸãã ãããã£ãŠã GetResult ã®æ»ãå€ã®åã voidå Žåã await_expression ã¯äœãåé¡ãããŸããã
void 以å€ã®æ»ãå€ã®å Tãããå Žåã await_expression 㯠Tåã®å€ãšããŠåé¡ãããŸãã
12.9.9.4 await åŒã®å®è¡æè©äŸ¡
å®è¡æã«ãåŒ await t ã¯æ¬¡ã®ããã«è©äŸ¡ãããŸãã
- awaiter
aã¯ãåŒ(t).GetAwaiter()ãè©äŸ¡ããããšã«ãã£ãŠååŸãããŸãã -
boolbã¯ãåŒ(a).IsCompletedãè©äŸ¡ããããšã«ãã£ãŠåŸãããŸãã -
bãfalseå Žåãè©äŸ¡ã¯ãã€ã³ã¿ãŒãã§ã€ã¹aãå®è£System.Runtime.CompilerServices.ICriticalNotifyCompletionãã©ããã«ãã£ãŠç°ãªããŸã (以äžãç°¡æœã«ããããã«ICriticalNotifyCompletionãšåŒã°ããŸã)ã ãã®ãã§ãã¯ã¯ãã€ã³ãæã«è¡ãããŸããã€ãŸããaãã³ã³ãã€ã«æã®ådynamicãæã€å Žåã¯å®è¡æããã以å€ã®å Žåã¯ã³ã³ãã€ã«æã§ãã åéããªã²ãŒãr瀺ããŸã (§15.14):-
aãICriticalNotifyCompletionãå®è£ ããŠããªãå Žåã¯ãåŒ((a) as INotifyCompletion).OnCompleted(r)ãè©äŸ¡ãããŸãã -
aãICriticalNotifyCompletionãå®è£ ããŠããå Žåã¯ãåŒ((a) as ICriticalNotifyCompletion).UnsafeOnCompleted(r)ãè©äŸ¡ãããŸãã - è©äŸ¡ãäžæãããéåæé¢æ°ã®çŸåšã®åŒã³åºãå ã«å¶åŸ¡ãè¿ãããŸãã
-
- çŽåŸ (
bãtrueãããå Žå) ãŸãã¯åéããªã²ãŒãã®åŸã®åŒã³åºãæ (bãfalseãããå Žå)ãåŒ(a).GetResult()ãè©äŸ¡ãããŸãã å€ãè¿ãå Žåããã®å€ã¯ await_expressionã®çµæã«ãªããŸãã ãã以å€ã®å Žåãçµæã¯ãããŸããã
INotifyCompletion.OnCompleted ããã³ ICriticalNotifyCompletion.UnsafeOnCompleted ã€ã³ã¿ãŒãã§ã€ã¹ ã¡ãœããã® awaiter ã®å®è£
ã«ãããããªã²ãŒã r ãæå€§ 1 ååŒã³åºãããŸãã ãã以å€ã®å Žåãå
å«ããéåæé¢æ°ã®åäœã¯æªå®çŸ©ã§ãã
12.10 åŒãã
with_expressionã§ã¯ãæ¢åã®ã¬ã³ãŒã ã¯ã©ã¹ãã¬ã³ãŒãæ§é äœããŸãã¯ã¬ã³ãŒã以å€ã®æ§é äœã€ã³ã¹ã¿ã³ã¹ã®ã³ããŒã§ããæ°ããã¬ã³ãŒã ã¯ã©ã¹ãã¬ã³ãŒãæ§é äœããŸãã¯ã¬ã³ãŒã以å€ã®æ§é äœã€ã³ã¹ã¿ã³ã¹ãäœæããããšã§ãéç Žå£çãªå€æŽãè¡ããŸããå¿ èŠã«å¿ããŠãæå®ããããããã£ãšãã£ãŒã«ãã倿ŽããŸãã
with_expression
: switch_expression
| switch_expression 'with' '{' member_initializer_list? '}'
;
with_expressionã¯ã¹ããŒãã¡ã³ããšããŠäœ¿çšã§ããŸããã
åä¿¡åŽã®åã¯ãvoid 以å€ã®ã¬ã³ãŒã ã¯ã©ã¹ãã¬ã³ãŒãæ§é äœããŸãã¯ã¬ã³ãŒã以å€ã®æ§é äœåã§ããå¿
èŠããããŸãã
èå¥å ã¯ãåä¿¡è ã®åã®ã¢ã¯ã»ã¹å¯èœãªã€ã³ã¹ã¿ã³ã¹ ãã£ãŒã«ããŸãã¯ããããã£ã§ããå¿ èŠããããŸãã
倿Žããããã¹ãŠã®äœçœ®æå®ããããã£ã¯ãset ã¢ã¯ã»ãµãŒãš init ã¢ã¯ã»ãµãŒã®äž¡æ¹ãæã€å¿ èŠããããŸãã
ãã®åŒã¯æ¬¡ã®ããã«è©äŸ¡ãããŸãã
- ã¬ã³ãŒã ã¯ã©ã¹åã®å Žåãåä¿¡åŽã®ã¯ããŒã³ ã¡ãœãã (§15.16.4.4) ãåŒã³åºããããã®çµæãåä¿¡åŽã®åã«å€æãããŸãã
- ã¬ã³ãŒãæ§é äœãŸãã¯éã¬ã³ãŒãæ§é äœåã®å Žåãåä¿¡åŽãã³ããŒãããŸãã
- å
member_initializerã¯ã倿ã®çµæã®ãã£ãŒã«ããŸãã¯ãããã㣠ã¢ã¯ã»ã¹ãžã®å²ãåœãŠãšåãæ¹æ³ã§åŠçãããŸãã å²ãåœãŠã¯åå¥ã®é åºã§åŠçãããŸãã member_initializer_listãçç¥ãããšãã¡ã³ããŒã¯å€æŽãããŸããã
äŸ:
Person person1 = new("Mary", "Smith") { Age = 35 }; // create an immutable record Person person2 = person1 with { FirstName = "Jane" }; // copy with FirstName changed person2 = person1 with { Age = 40 }; // copy with Age changed person2 = person1 with { }; // copy with no changes public record Person(string FirstName, string LastName) { public int Age { get; init; } }çµäºãµã³ãã«
12.11 Range æŒç®å
..æŒç®åã¯ç¯å²æŒç®åãšåŒã°ããŸãã
range_expression
: unary_expression
| unary_expression? '..' unary_expression?
;
å®çŸ©æžã¿ã®ç¯å²æŒç®åã¯æ¬¡ã®ãšããã§ãã
Range operator ..(Index x, Index y);
ç¯å²æŒç®åã¯ãªãŒããŒããŒãã§ããŸãã (§12.4.3)ã
ãã¹ãŠã®ç¯å²åŒã¯ã次ã®ãããªåœ¢åŒ x..yãæã€ãã®ãšããŠæ±ãããŸãã
-
xã¯å·Šãªãã©ã³ã (ååšããå Žå) ã§ãããã以å€ã®å Žåã¯åŒ0ã -
yã¯ãååšããå Žåã¯å³ãªãã©ã³ãããã以å€ã®å Žåã¯åŒ^0ã
æäœã®çµæã¯ãåŒã®çµæãšåçã® Range (§18.3) å€ã«ãªããŸãã
new Range(x, y)
ç¯å²åŒã®ã©ã¡ããäžæ¹ãŸãã¯äž¡æ¹ã®ãªãã©ã³ãã«ã³ã³ãã€ã«æã®åã dynamicå ŽåãåŒã¯åçã«ãã€ã³ããããŸã (§12.3.3)ã çµæã®ã³ã³ãã€ã«æã®åã¯åžžã« Rangeã
ç¯å²æŒç®åã®ãªãã (§12.4.8) 圢åŒãäºåã«å®çŸ©ãããŠããŸãã
ç¯å²æŒç®åã¯é飿³ (§12.4.2) ã§ãã
12.12 Switch åŒ
switch_expressionã¯ãåŒã³ã³ããã¹ãã§switchã®ãããªã»ãã³ãã£ã¯ã¹ãæäŸããŸãã
switch_expression
: range_expression
| switch_expression 'switch' '{' switch_expression_arms? '}'
;
switch_expression_arms
: switch_expression_arm (',' switch_expression_arm)* ','?
;
switch_expression_arm
: pattern case_guard? '=>' switch_expression_arm_expression
;
switch_expression_arm_expression
: expression
;
switch_expressionã®åã¯ãswitch_expression_armã®switch_expression_arm_expressionã®æãäžè¬çãªå §12.6.3.17) ã§ã (ãã®ãããªåãååšããå Žåãããã³åswitch_expression_arm_expressionããã®åã«æé»çã«å€æã§ããå Žå)ã ãã以å€ã®å Žåã switch_expression ã«ã¯åã¯ãããŸãããã åŒã®å€æãåãæ¿ãã å¯èœæ§ããããŸã (§10.2.18)ã
ããããã®switch_expression_armã®ãã¿ãŒã³ããã¹ã€ããåŒã®åã®éã¬ãŒã (§13.8.3) ã®ãã¿ãŒã³ã»ãã (§13.8.3) ã«ãã£ãŠãµãã¹ã switch_expression_armå Žåããšã©ãŒã«ãªããŸãã
ã¹ã€ããåŒã¯ãå ¥åã®ãã¹ãŠã®å€ãã¹ã€ããåŒã®å°ãªããšã 1 ã€ã®ã¢ãŒã ã«ãã£ãŠåŠçãããå Žåã ç¶²çŸ ç ã§ãã ã¹ã€ããåŒãå®å šã§ãªãå Žåã¯ãèŠåãçºè¡ãããå¯èœæ§ããããŸãã
å®è¡æã«ãswitch_expressionã®çµæã¯ãswitch_expressionã®å·ŠåŽã®åŒãswitch_expression_armã®ãã¿ãŒã³ãšäžèŽããswitch_expression_armã®case_guard (ååšããå Žå) ãã«è©äŸ¡ãããæåã®trueã®åŒã®å€ã§ãã ãã®ãã㪠switch_expression_armããªãå Žåã switch_expression ã¯äŸå€ System.Runtime.CompilerServices.SwitchExpressionExceptionã®ã€ã³ã¹ã¿ã³ã¹ãã¹ããŒããŸãã
泚: äžèšã®èŠç¹ã¯ãswitch_expression_armsãæããªãswitch_expressionã¯ã³ã³ãã€ã«æã®èŠåãçæããå®è¡æã«è©äŸ¡ãããå Žåã¯åžžã«äŸå€ãã¹ããŒããããšã§ãã æ³šé
äŸ: 次ã¯ããªã³ã©ã€ã³ ãããäžã®èŠèŠçãªæ¹åã衚ãåæåã®å€ãã察å¿ããã«ãŒãã£ãæ¹åã«å€æããŸãã
static Orientation ToOrientation(Direction direction) => direction switch { Direction.Up => Orientation.North, Direction.Right => Orientation.East, Direction.Down => Orientation.South, Direction.Left => Orientation.West, _ => throw new ArgumentOutOfRangeException(direction.ToString()), }; public enum Direction { Up, Down, Right, Left } public enum Orientation { North, South, East, West }çµäºãµã³ãã«
12.13 ç®è¡æŒç®å
12.13.1 å šè¬
*ã /ã %ã +ãããã³ - æŒç®åã¯ç®è¡æŒç®åãšåŒã°ããŸãã
multiplicative_expression
: switch_expression
| multiplicative_expression '*' switch_expression
| multiplicative_expression '/' switch_expression
| multiplicative_expression '%' switch_expression
;
additive_expression
: multiplicative_expression
| additive_expression '+' multiplicative_expression
| additive_expression '-' multiplicative_expression
;
ç®è¡æŒç®åã®ãªãã©ã³ãã«ã³ã³ãã€ã«æã®å dynamicãããå ŽåãåŒã¯åçã«ãã€ã³ããããŸã (§12.3.3)ã ãã®å ŽåãåŒã®ã³ã³ãã€ã«æã®å㯠dynamicã§ãããã³ã³ãã€ã«æã®å dynamicãæã€ãªãã©ã³ãã®å®è¡æã®åã䜿çšããŠãå®è¡æã«ä»¥äžã§èª¬æãã解決ãè¡ãããŸãã
12.13.2 ä¹ç®æŒç®å
ãã©ãŒã x * y ã®æŒç®ã§ã¯ãäºé
æŒç®åã®ãªãŒããŒããŒã解決 (§12.4.5) ãé©çšãããç¹å®ã®æŒç®åã®å®è£
ãéžæãããŸãã ãªãã©ã³ãã¯éžæããæŒç®åã®ãã©ã¡ãŒã¿ãŒåã«å€æãããçµæã®åã¯æŒç®åã®æ»ãå€ã®åã«ãªããŸãã
å®çŸ©æžã¿ã®ä¹ç®æŒç®åãæ¬¡ã«ç€ºããŸãã æŒç®åã¯ãã¹ãŠã x ãš y ã®ç©ãèšç®ããŸãã
æŽæ°ä¹ç®:
int operator *(int x, int y); uint operator *(uint x, uint y); nint operator *(nint x, nint y); nuint operator *(nuint x, nuint y); long operator *(long x, long y); ulong operator *(ulong x, ulong y);checkedã³ã³ããã¹ãã§ã¯ãçæç©ãçµæåã®ç¯å²å€ã«ããå ŽåãSystem.OverflowExceptionãã¹ããŒãããŸããuncheckedã³ã³ããã¹ãã§ã¯ããªãŒããŒãããŒã¯å ±åããããçµæã®çš®é¡ã®ç¯å²å€ã®éèŠãªäžäœãããã¯ç Žæ£ãããŸããæµ®åå°æ°ç¹ä¹ç®:
float operator *(float x, float y); double operator *(double x, double y);ç©ã¯ IEC 60559 ç®è¡ã®èŠåã«åŸã£ãŠèšç®ãããŸãã æ¬¡ã®è¡šã«ã0 以å€ã®æéå€ããŒããç¡é倧ãããã³ NaN ã®ãã¹ãŠã®å¯èœãªçµã¿åããã®çµæã瀺ããŸãã ãã®è¡šã§ã¯ã
xãšyã¯æ£ã®æéå€ã§ããzã¯ãæãè¿ã衚çŸå¯èœãªå€ã«äžžããããx * yã®çµæã§ãã çµæã®å€§ããã倿å ã®åã«å¯ŸããŠå€§ããããå Žåãzã¯ç¡é倧ã§ãã äžžãã®ããã«ãzãxããŒãã§ãªããŠããy㯠0 ã«ãªãå¯èœæ§ããããŸãã+y-y+0-0+â-âNaN+x+z-z+0-0+â-âNaN-x-z+z-0+0-â+âNaN+0+0-0+0-0NaNNaNNaN-0-0+0-0+0NaNNaNNaN+â+â-âNaNNaN+â-âNaN-â-â+âNaNNaN-â+âNaNNaNNaNNaNNaNNaNNaNNaNNaN(ç¹ã«æèšãããŠããªãå Žåãé€ãã §12.13.2â§12.13.6 ã®æµ®åå°æ°ç¹ããŒãã«ã§ã¯ã"
+" ã®äœ¿çšã¯å€ãæ£ã§ããããšãæå³ããŸãã"-" ã¯å€ãè² ã§ããããšãæå³ãã笊å·ããªãå Žåã¯ãå€ãæ£ãŸãã¯è² ã§ãããã笊å·ããªãå¯èœæ§ãããããšãæå³ããŸã (NaN)ãå°æ°ã®ä¹ç®
decimal operator *(decimal x, decimal y);çµæã®å€ã®å€§ããã10é²åœ¢åŒã§è¡šçŸããã«ã¯å€§ããããå Žåã
System.OverflowExceptionãã¹ããŒãããŸãã äžžãã®ãããã©ã¡ãã®ãªãã©ã³ãã 0 ã§ãªãå Žåã§ããçµæã¯ 0 ã«ãªãå¯èœæ§ããããŸãã åæšäºå ¥åã®çµæã®ã¹ã±ãŒã«ã¯ã2 ã€ã®ãªãã©ã³ãã®ã¹ã±ãŒã«ã®åèšã«ãªããŸãã 10 鲿°ä¹ç®ã¯ãSystem.Decimalåã®ä¹ç®æŒç®åã䜿çšããããšãšåãã§ãã
äžã§å®çŸ©ããããªãããããŠããªãå®çŸ©æžã¿ä¹ç®æŒç®åã®ãªãããããåœ¢åŒ (§12.4.8) ãäºåã«å®çŸ©ãããŠããŸãã
12.13.3 é€ç®æŒç®å
ãã©ãŒã x / y ã®æŒç®ã§ã¯ãäºé
æŒç®åã®ãªãŒããŒããŒã解決 (§12.4.5) ãé©çšãããç¹å®ã®æŒç®åã®å®è£
ãéžæãããŸãã ãªãã©ã³ãã¯éžæããæŒç®åã®ãã©ã¡ãŒã¿ãŒåã«å€æãããçµæã®åã¯æŒç®åã®æ»ãå€ã®åã«ãªããŸãã
å®çŸ©æžã¿ã®é€ç®æŒç®åãæ¬¡ã«ç€ºããŸãã æŒç®åã¯ã©ãããx ãš yã®åãèšç®ããŸãã
æŽæ°ã®é€ç®:
int operator /(int x, int y); uint operator /(uint x, uint y); nint operator /(nint x, nint y); nuint operator /(nuint x, nuint y); long operator /(long x, long y); ulong operator /(ulong x, ulong y);å³ãªãã©ã³ãã®å€ã 0 ã®å Žåã
System.DivideByZeroExceptionãã¹ããŒãããŸããé€ç®ã¯çµæã 0 ã«äžžããŸãã ãããã£ãŠãçµæã®çµ¶å¯Ÿå€ã¯ã2 ã€ã®ãªãã©ã³ãã®åã®çµ¶å¯Ÿå€ä»¥äžã®æå€§ã®æŽæ°ã«ãªããŸãã 2 ã€ã®ãªãã©ã³ããåã笊å·ãæã¡ã2 ã€ã®ãªãã©ã³ããå察ã®ç¬Šå·ãæã€å Žåã0 ãŸãã¯è² ã®å Žåãçµæã¯ 0 ãŸãã¯æ£ã«ãªããŸãã
å·Šãªãã©ã³ãã衚çŸå¯èœãªæå°ã®
intãnintããŸãã¯longå€ã§ãããå³ãªãã©ã³ããâ1å ŽåããªãŒããŒãããŒãçºçããŸããcheckedã³ã³ããã¹ãã§ã¯ãSystem.ArithmeticException(ãŸãã¯ãã®ãµãã¯ã©ã¹) ãã¹ããŒãããåå ã«ãªããŸããuncheckedã³ã³ããã¹ãã§ã¯ãSystem.ArithmeticException(ãŸãã¯ãã®ãµãã¯ã©ã¹) ãã¹ããŒããããããªãŒããŒãããŒãå·Šãªãã©ã³ãã®çµæã®å€ãšå ±ã«ã¬ããŒããããªããã©ããã«ã€ããŠå®è£ å®çŸ©ãããŸããæµ®åå°æ°ç¹ã®é€ç®:
float operator /(float x, float y); double operator /(double x, double y);å㯠IEC 60559 ç®è¡ã®èŠåã«åŸã£ãŠèšç®ãããŸãã æ¬¡ã®è¡šã«ã0 以å€ã®æéå€ããŒããç¡é倧ãããã³ NaN ã®ãã¹ãŠã®å¯èœãªçµã¿åããã®çµæã瀺ããŸãã ãã®è¡šã§ã¯ã
xãšyã¯æ£ã®æéå€ã§ããzã¯ãæãè¿ã衚çŸå¯èœãªå€ã«äžžããããx / yã®çµæã§ãã+y-y+0-0+â-âNaN+x+z-z+â-â+0-0NaN-x-z+z-â+â-0+0NaN+0+0-0NaNNaN+0-0NaN-0-0+0NaNNaN-0+0NaN+â+â-â+â-âNaNNaNNaN-â-â+â-â+âNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN10 鲿³ã®é€ç®:
decimal operator /(decimal x, decimal y);å³ãªãã©ã³ãã®å€ã 0 ã®å Žåã
System.DivideByZeroExceptionãã¹ããŒãããŸãã çµæã®å€ã®å€§ããã10é²åœ¢åŒã§è¡šçŸããã«ã¯å€§ããããå ŽåãSystem.OverflowExceptionãã¹ããŒãããŸãã äžžãã®ãããæåã®ãªãã©ã³ãã 0 ã§ãªãå Žåã§ããçµæã¯ 0 ã«ãªãå¯èœæ§ããããŸãã äžžããåã®çµæã®ã¹ã±ãŒã«ã¯ãæ£ç¢ºãªçµæãšåãçµæãä¿æããåªå ã¹ã±ãŒã«ã«æãè¿ãã¹ã±ãŒã«ã§ãã æšå¥šãããã¹ã±ãŒã«ã¯ãxã®ã¹ã±ãŒã«ããyã®ã¹ã±ãŒã«ãåŒãããã®ã§ãã10 鲿°é€ç®ã¯ã
System.Decimalåã®é€ç®æŒç®åã䜿çšããããšãšåãã§ãã
äžèšã§å®çŸ©ãããŠããæªãªããã®å®çŸ©æžã¿é€ç®æŒç®åã®ãªãã (§12.4.8) 圢åŒãäºåå®çŸ©ãããŠããŸãã
12.13.4 å°äœæŒç®å
ãã©ãŒã x % y ã®æŒç®ã§ã¯ãäºé
æŒç®åã®ãªãŒããŒããŒã解決 (§12.4.5) ãé©çšãããç¹å®ã®æŒç®åã®å®è£
ãéžæãããŸãã ãªãã©ã³ãã¯éžæããæŒç®åã®ãã©ã¡ãŒã¿ãŒåã«å€æãããçµæã®åã¯æŒç®åã®æ»ãå€ã®åã«ãªããŸãã
å®çŸ©æžã¿ã®å°äœæŒç®åãæ¬¡ã«ç€ºããŸãã æŒç®åã¯ãã¹ãŠã x ãš y ã®éã®é€ç®ã®å°äœãèšç®ããŸãã
æŽæ°ã®å°äœ:
int operator %(int x, int y); uint operator %(uint x, uint y); nint operator %(nint x, nint y); nuint operator %(nuint x, nuint y); long operator %(long x, long y); ulong operator %(ulong x, ulong y);x % yã®çµæã¯ãx â (x / y) * yã«ãã£ãŠçæãããå€ã§ããyã 0 ã§ããå Žåã¯ãSystem.DivideByZeroExceptionãã¹ããŒãããŸããå·Šãªãã©ã³ããæå°ã®
intãnintããŸãã¯longå€ã§ãå³ãªãã©ã³ããâ1å ŽåãSystem.OverflowExceptionãäŸå€ãã¹ããŒããå Žåã«ã®ã¿ãx / yãã¹ããŒãããŸããæµ®åå°æ°ç¹ã®å°äœ:
float operator %(float x, float y); double operator %(double x, double y);次ã®è¡šã«ã0 以å€ã®æéå€ããŒããç¡é倧ãããã³ NaN ã®ãã¹ãŠã®å¯èœãªçµã¿åããã®çµæã瀺ããŸãã ãã®è¡šã§ã¯ã
xãšyã¯æ£ã®æéå€ã§ããzã¯x % yã®çµæã§ãããx â n * yãšããŠèšç®ãããŸããããã§ãn ã¯x / y以äžã®æå€§ã®æŽæ°ã§ãã å°äœãèšç®ãããã®æ¹æ³ã¯ãæŽæ°ãªãã©ã³ãã«äœ¿çšãããæ¹æ³ã«äŒŒãŠããŸãããIEC 60559 å®çŸ© (nã¯x / yã«æãè¿ãæŽæ°) ãšã¯ç°ãªããŸãã+y-y+0-0+â-âNaN+x+z+zNaNNaN+x+xNaN-x-z-zNaNNaN-x-xNaN+0+0+0NaNNaN+0+0NaN-0-0-0NaNNaN-0-0NaN+âNaNNaNNaNNaNNaNNaNNaN-âNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN10 鲿³ã®å°äœ:
decimal operator %(decimal x, decimal y);å³ãªãã©ã³ãã®å€ã 0 ã®å Žåã
System.DivideByZeroExceptionãã¹ããŒãããŸããSystem.ArithmeticException(ãŸãã¯ãã®ãµãã¯ã©ã¹) ãã¹ããŒãããæ¡ä»¶ã¯ãå®è£ ã«ãã£ãŠå®çŸ©ãããŸãã æºæ ããå®è£ ããx % yã®äŸå€ãã¹ããŒããªããŠããx / yã¯äŸå€ãã¹ããŒããŸããã äžžããåã®çµæã®ã¹ã±ãŒã«ã¯ã2 ã€ã®ãªãã©ã³ãã®ã¹ã±ãŒã«ã®å€§ããæ¹ã§ããã0 以å€ã®å Žåãçµæã®ç¬Šå·ã¯xã®ã¹ã±ãŒã«ãšåãã§ãã10 é²å°äœã¯ã
System.Decimalåã®å°äœæŒç®åã䜿çšããããšãšåãã§ããæ³šæ: ãããã®èŠåã«ããããã¹ãŠã®åã«å¯ŸããŠãçµæãå·Šãªãã©ã³ãã®å察ã®ç¬Šå·ãæã€ããšã¯ãããŸããã æ³šé
äžã§å®çŸ©ãããæªãªããç¶æ ã®å®çŸ©æžã¿å°äœæŒç®åã®ãªãã圢åŒïŒÂ§12.4.8ïŒããããããå®çŸ©ãããŠããŸãã
12.13.5 å ç®æŒç®å
ãã©ãŒã x + y ã®æŒç®ã§ã¯ãäºé
æŒç®åã®ãªãŒããŒããŒã解決 (§12.4.5) ãé©çšãããç¹å®ã®æŒç®åã®å®è£
ãéžæãããŸãã ãªãã©ã³ãã¯éžæããæŒç®åã®ãã©ã¡ãŒã¿ãŒåã«å€æãããçµæã®åã¯æŒç®åã®æ»ãå€ã®åã«ãªããŸãã
å®çŸ©æžã¿ã®å ç®æŒç®åãæ¬¡ã«ç€ºããŸãã æ°å€åãšåæåã®å Žåãå®çŸ©æžã¿ã®å ç®æŒç®åã¯ã2 ã€ã®ãªãã©ã³ãã®åèšãèšç®ããŸãã äžæ¹ãŸãã¯äž¡æ¹ã®ãªãã©ã³ãã stringåã®å Žåãå®çŸ©æžã¿ã®å ç®æŒç®åã¯ãªãã©ã³ãã®æåå衚çŸãé£çµããŸãã äž¡æ¹ã®ãªãã©ã³ãã ReadOnlySpan<byte> åã§ãäž¡æ¹ãã»ãã³ãã£ã㯠UTF-8 ãã€ã衚çŸã§ããå Žåãå®çŸ©æžã¿ã®å ç®æŒç®åã¯ãªãã©ã³ãã®ãã€ããé£çµããŸãã
æŽæ°ã®å ç®:
int operator +(int x, int y); uint operator +(uint x, uint y); nint operator +(nint x, nint y); nuint operator +(nuint x, nuint y); long operator +(long x, long y); ulong operator +(ulong x, ulong y);checkedã³ã³ããã¹ãã§ã¯ãåèšãçµæåã®ç¯å²å€ã§ããå ŽåãSystem.OverflowExceptionãã¹ããŒãããŸããuncheckedã³ã³ããã¹ãã§ã¯ããªãŒããŒãããŒã¯å ±åããããçµæã®çš®é¡ã®ç¯å²å€ã®éèŠãªäžäœãããã¯ç Žæ£ãããŸããæµ®åå°æ°ç¹å ç®:
float operator +(float x, float y); double operator +(double x, double y);å㯠IEC 60559 ç®è¡ã®èŠåã«åŸã£ãŠèšç®ãããŸãã æ¬¡ã®è¡šã«ã0 以å€ã®æéå€ããŒããç¡é倧ãããã³ NaN ã®ãã¹ãŠã®å¯èœãªçµã¿åããã®çµæã瀺ããŸãã ãã®è¡šã§ã¯ã
xãšy㯠0 以å€ã®æéå€ã§ãããzã¯x + yã®çµæã§ããxãšyãåã倧ããã§ç¬Šå·ãéã®å Žåãzã¯æ£ã®ãŒãã«ãªããŸããx + yã倧ããããŠå€æå ã®åã§è¡šãã«ã¯ãzã¯x + yãšåã笊å·ãæã€ç¡é倧ã§ããy+0-0+â-âNaNxzxx+â-âNaN+0y+0+0+âââNaN-0y+0-0+â-âNaN+â+â+â+â+âNaNNaN-â-â-â-âNaN-âNaNNaNNaNNaNNaNNaNNaNNaN10 鲿³ã®å ç®:
decimal operator +(decimal x, decimal y);çµæã®å€ã®å€§ããã10é²åœ¢åŒã§è¡šçŸããã«ã¯å€§ããããå Žåã
System.OverflowExceptionãã¹ããŒãããŸãã äžžããåã®çµæã®ã¹ã±ãŒã«ã¯ã2 ã€ã®ãªãã©ã³ãã®ã¹ã±ãŒã«ã®ãã¡å€§ããæ¹ã§ãã10 é²å ç®ã¯ã
System.Decimalåã®å ç®æŒç®åã䜿çšããããšãšåãã§ããåæã®å ç®ã ãã¹ãŠã®åæåã¯ã次ã®å®çŸ©æžã¿ã®æŒç®åãæé»çã«æäŸããŸããããã§ã
Eã¯åæåãUã¯Eã®åºã«ãªãåã§ããE operator +(E x, U y); E operator +(U x, E y);å®è¡æã«ããããã®æŒç®åã¯
(E)((U)x + (U)y) ãšãŸã£ããåãããã«è©äŸ¡ãããŸããUTF-16 æååé£çµ:
string operator +(string x, string y); string operator +(string x, object y); string operator +(object x, string y);ãã€ããª
+æŒç®åã®ãããã®ãªãŒããŒããŒãã¯ãUTF-16 æååã®é£çµãå®è¡ããŸãã ãªãã©ã³ããnullå Žåã¯ã空㮠UTF-16 æååã眮ãæããããŸãã ãã以å€ã®å Žåãref æ§é äœ (string) ã§ã¯ãªã以å€ã®ãªãã©ã³ãã¯ãToStringåããç¶æ¿ãããä»®æ³objectã¡ãœãããåŒã³åºãããšã«ãã£ãŠãUTF-16 æåå衚çŸã«å€æãããŸããToStringãnullãè¿ãå Žåã空㮠UTF-16 æååã眮æãããŸããäŸ:
class Test { static void Main() { string s = null; Console.WriteLine("s = >" + s + "<"); // Displays s = >< int i = 1; Console.WriteLine("i = " + i); // Displays i = 1 float f = 1.2300E+15F; Console.WriteLine("f = " + f); // Displays f = 1.23E+15 decimal d = 2.900m; Console.WriteLine("d = " + d); // Displays d = 2.900 } }ã³ã¡ã³ãã«è¡šç€ºãããåºåã¯ãUS-English ã·ã¹ãã ã§ã®äžè¬çãªçµæã§ãã æ£ç¢ºãªåºåã¯ãå®è¡ç°å¢ã®ãªãŒãžã§ã³èšå®ã«ãã£ãŠç°ãªããŸãã æååé£çµæŒç®åèªäœã¯ãããã®å Žåãåãããã«åäœããŸãããå®è¡äžã«æé»çã«åŒã³åºããã
ToStringã¡ãœããã¯ãå°åèšå®ã®åœ±é¿ãåããå¯èœæ§ããããŸããçµäºãµã³ãã«
æŒç®åã®çµæã¯ãå·Šãªãã©ã³ãã®æåã®åŸã«å³ãªãã©ã³ãã®æåãç¶ã
stringã§ãã æååé£çµæŒç®åã¯ãnullå€ãè¿ããŸããã ã¡ã¢ãªäžè¶³ã§çµæã®æååãå²ãåœãŠãããªãå ŽåãSystem.OutOfMemoryExceptionãæããããå¯èœæ§ããããŸããUTF-8 æååé£çµ:
ReadOnlySpan<byte> operator +(ReadOnlySpan<byte> x, ReadOnlySpan<byte> y);ãã€ããª
+æŒç®åã®ãã®ãªãŒããŒããŒãã¯ãUTF-8 æååãªãã©ã«ãšããã®æŒç®åã®ä»ã®ã¢ããªã±ãŒã·ã§ã³ã®çµæã®é£çµãå®è¡ããŸã (ãã㯠UTF-16 æååé£çµãããã¯ããã«å¶éãå³ãããªã£ãŠããŸã)ã äž¡æ¹ã®ãªãã©ã³ãã ã»ãã³ãã£ã㯠UTF-8 ãã€ã衚çŸã§ããå Žåã«ã®ã¿é©çšãããŸãã ãªãã©ã³ãã¯ã UTF-8 æååãªãã©ã«ããã®æŒç®åã®é©çšçµæããŸãã¯å²ãŸããåŒãæå³çã« UTF-8 ãã€ã衚çŸã§ãããã£ãã§å²ãŸããåŒã§ããå Žåã æå³çã«ã¯ UTF-8 ãã€ã衚çŸã§ããæŒç®åã®çµæã¯ãå·Šãªãã©ã³ãã®ãã€ããšå³ãªãã©ã³ãã®ãã€ãã§æ§æããã
ReadOnlySpan<byte>ã§ãã çµæèªäœã¯ æå³çã«ã¯ UTF-8 ãã€ã衚çŸã§ããããããã®æŒç®åãããã«é©çšããããã®ãªãã©ã³ããšããŠäœ¿çšã§ããŸããäŸ:
ReadOnlySpan<byte> sp1 = "ABC"u8 + "DEF"u8; // OK ReadOnlySpan<byte> sp2 = sp1 + "DEF"u8; // error ReadOnlySpan<byte> sp3 = "ABC"u8 + "DEF"u8 + "123"u8; // OK ReadOnlySpan<byte> sp4 = "ABC"u8 + (ReadOnlySpan<byte>)stackalloc byte[] { (byte)'D', (byte)'E', (byte)'F', (byte)'\x0' }; // errorsp1ã®å Žåãäž¡æ¹ã®ãªãã©ã³ã㯠UTF-8 æååãªãã©ã«ã§ãã ãã ããsp1åæåããããšããã® UTF-8 è¡çµ±ã¯è¿œè·¡ãããªããªããŸãã ã€ãŸããsp1èªäœã¯ UTF-8 ã§ãšã³ã³ãŒããããŠãããšã¯èŠãªãããŸããã ãã®ãããsp2ã®åæåã®å Žåã¯ãªãã©ã³ãã«ããããšã¯ã§ããŸãããsp3ã®åæååã§ã¯ããªãã©ã³ãã®å·ŠåŽã®ãã¢ãè©äŸ¡ãããäž¡æ¹ã UTF-8 æååãªãã©ã«ã§ãããããçµæã UTF-8 ãšã³ã³ãŒããšèŠãªããããããå³åŽã®æŒç®åã®å·Šãªãã©ã³ããšããŠããã«äœ¿çšã§ããŸããsp4ã®å Žåãäž¡æ¹ã®ãªãã©ã³ããReadOnlySpan<byte>ãããŠããéãSpan<byte>ã«ãã£ãŠè¿ãããstackallocã UTF-8 æååãªãã©ã« (ã€ãŸããnull ãã€ã ã¿ãŒãããŒã¿ãæã€ãã€ãé å) ã®å éšåœ¢åŒãæã£ãŠããå Žåã§ããå·ŠåŽã®ãªãã©ã³ãã®ã¿ã UTF-8 ãšã³ã³ãŒããããŸãã §6.4.5.6 ãåç §ããŠãã ããã çµäºãµã³ãã«ããªã²ãŒãã®çµã¿åããã ãã¹ãŠã®ããªã²ãŒãåã¯ã次ã®å®çŸ©æžã¿ã®æŒç®åãæé»çã«æäŸããŸããããã§ã
Dã¯ããªã²ãŒãåã§ããD operator +(D x, D y);æåã®ãªãã©ã³ãã
nullã®å ŽåãæŒç®ã®çµæã¯ 2 çªç®ã®ãªãã©ã³ãã®å€ã«ãªããŸã (ãããnullã§ããå Žåã§ã)ã ãã以å€ã®å Žåã2 çªç®ã®ãªãã©ã³ããnullå ŽåãæŒç®ã®çµæã¯æåã®ãªãã©ã³ãã®å€ã«ãªããŸãã ãã以å€ã®å ŽåãæŒç®ã®çµæã¯ãåŒã³åºããªã¹ããæåã®ãªãã©ã³ãã®åŒã³åºããªã¹ãå ã®èŠçŽ ã§æ§æããããã®åŸã« 2 çªç®ã®ãªãã©ã³ãã®åŒã³åºããªã¹ãå ã®èŠçŽ ãç¶ãæ°ããããªã²ãŒã ã€ã³ã¹ã¿ã³ã¹ã«ãªããŸãã ã€ãŸããçµæã®ããªã²ãŒãã®åŒã³åºããªã¹ãã¯ã2 ã€ã®ãªãã©ã³ãã®åŒã³åºããªã¹ããé£çµãããã®ã§ããæ³š: ããªã²ãŒãã®çµã¿åããã®äŸã«ã€ããŠã¯ã §12.13.6 ãã㳠§21.6 ãåç §ããŠãã ããã
System.Delegateã¯ããªã²ãŒãåã§ã¯ãªããããæŒç®å + ã¯ããã«å¯ŸããŠå®çŸ©ãããŠããŸãããæ³šèš
äžã§å®çŸ©ããããªãããããŠããªãå®çŸ©æžã¿å ç®æŒç®åã®ãªãããããåœ¢åŒ (§12.4.8) ãå®çŸ©æžã¿ã§ãã
12.13.6 æžç®æŒç®å
ãã©ãŒã x â y ã®æŒç®ã§ã¯ãäºé
æŒç®åã®ãªãŒããŒããŒã解決 (§12.4.5) ãé©çšãããç¹å®ã®æŒç®åã®å®è£
ãéžæãããŸãã ãªãã©ã³ãã¯éžæããæŒç®åã®ãã©ã¡ãŒã¿ãŒåã«å€æãããçµæã®åã¯æŒç®åã®æ»ãå€ã®åã«ãªããŸãã
å®çŸ©æžã¿ã®æžç®æŒç®åã以äžã«ç€ºããŸãã æŒç®åã¯ãã¹ãŠã yãã x ãæžç®ããŸãã
æŽæ°ã®æžç®:
int operator -(int x, int y); uint operator -(uint x, uint y); nint operator -(nint x, nint y); nuint operator -(nuint x, nuint y); long operator -(long x, long y); ulong operator -(ulong x, ulong y);checkedã³ã³ããã¹ãã§ã¯ãå·®ç°ãçµæåã®ç¯å²å€ã«ããå ŽåãSystem.OverflowExceptionãã¹ããŒãããŸããuncheckedã³ã³ããã¹ãã§ã¯ããªãŒããŒãããŒã¯å ±åããããçµæã®çš®é¡ã®ç¯å²å€ã®éèŠãªäžäœãããã¯ç Žæ£ãããŸããæµ®åå°æ°ç¹æžç®:
float operator -(float x, float y); double operator -(double x, double y);差㯠IEC 60559 ç®è¡ã®èŠåã«åŸã£ãŠèšç®ãããŸãã æ¬¡ã®è¡šã«ã0 以å€ã®æéå€ããŒããç¡é倧ãããã³ NaN ã®ãã¹ãŠã®å¯èœãªçµã¿åããã®çµæã瀺ããŸãã ãã®è¡šã§ã¯ã
xãšy㯠0 以å€ã®æéå€ã§ãããzã¯x â yã®çµæã§ããxãšyãçããå Žåãzã¯æ£ã®ãŒãã«ãªããŸããx â yã倧ããããŠå€æå ã®åã§è¡šãã«ã¯ãzã¯x â yãšåã笊å·ãæã€ç¡é倧ã§ããy+0-0+â-âNaNxzxx-â+âNaN+0-y+0+0-â+âNaN-0-y-0+0-â+âNaN+â+â+â+âNaN+âNaN-â-â-â-â-âNaNNaNNaNNaNNaNNaNNaNNaNNaN(äžèšã®è¡šã§ã¯ã
-yã®ãšã³ããªã¯ ã®yã衚ããŠãããå€ãè² ã§ãããšããæå³ã§ã¯ãããŸããã)10 鲿³ã®æžç®:
decimal operator -(decimal x, decimal y);çµæã®å€ã®å€§ããã10é²åœ¢åŒã§è¡šçŸããã«ã¯å€§ããããå Žåã
System.OverflowExceptionãã¹ããŒãããŸãã äžžããåã®çµæã®ã¹ã±ãŒã«ã¯ã2 ã€ã®ãªãã©ã³ãã®ã¹ã±ãŒã«ã®ãã¡å€§ããæ¹ã§ãã10 鲿žç®ã¯ã
System.Decimalåã®æžç®æŒç®åã䜿çšããããšãšåãã§ããåæã®æžç®ã ãã¹ãŠã®åæåã¯ã次ã®å®çŸ©æžã¿ã®æŒç®åãæé»çã«æäŸããŸããããã§ã
Eã¯åæåãUã¯Eã®åºã«ãªãåã§ããU operator -(E x, E y);ãã®æŒç®åã¯ã
(U)((U)x â (U)y)ãšãŸã£ããåãããã«è©äŸ¡ãããŸãã ã€ãŸããæŒç®åã¯ãxãšyã®åºæ°å€ã®å·®ãèšç®ããçµæã®åã¯åæåã®åºã«ãªãåã«ãªããŸããE operator -(E x, U y);ãã®æŒç®åã¯ã
(E)((U)x â y)ãšãŸã£ããåãããã«è©äŸ¡ãããŸãã èšãæãããšãæŒç®åã¯åæåã®åºã«ãªãåããå€ãæžç®ããåæåã®å€ãçæããŸããããªã²ãŒãã®åé€ã ãã¹ãŠã®ããªã²ãŒãåã¯ã次ã®å®çŸ©æžã¿ã®æŒç®åãæé»çã«æäŸããŸããããã§ã
Dã¯ããªã²ãŒãåã§ããD operator -(D x, D y);ãã®ã»ãã³ãã£ã¯ã¹ã次ã«ç€ºããŸãã
- æåã®ãªãã©ã³ãã
nullã®å Žåã¯ãæŒç®çµæã¯nullã«ãªããŸãã - ãã以å€ã®å Žåã2 çªç®ã®ãªãã©ã³ãã
nullå ŽåãæŒç®ã®çµæã¯æåã®ãªãã©ã³ãã®å€ã«ãªããŸãã - ãã以å€ã®å Žåãäž¡æ¹ã®ãªãã©ã³ãã¯ç©ºã§ãªãåŒã³åºããªã¹ã (§21.2) ã衚ããŸãã
- ããªã²ãŒãç倿Œç®å (§12.15.9) ã«ãã£ãŠæ±ºå®ããããªã¹ããçããå Žåãæäœã®çµæã¯
nullã - ãã以å€ã®å Žåã2 çªç®ã®ãªãã©ã³ãã®ãªã¹ããæåã®ãªãã©ã³ãã®ãµããªã¹ãã§ããå ŽåãæŒç®ã®çµæã¯ã2 çªç®ã®ãªãã©ã³ãã®ãšã³ããªãåé€ãããæåã®ãªãã©ã³ãã®ãªã¹ãã§æ§æãããæ°ããåŒã³åºããªã¹ãã«ãªããŸãã (ãµããªã¹ãã®ç䟡æ§ã倿ããããã«ã察å¿ãããšã³ããªã¯ããªã²ãŒãç倿Œç®åãšæ¯èŒãããŸã)ã2 çªç®ã®ãªãã©ã³ãã®ãªã¹ãããæåã®ãªãã©ã³ãã®ãªã¹ãå ã®é£ç¶ãããšã³ããªã®è€æ°ã®ãµããªã¹ããšäžèŽããå Žåãé£ç¶ãããšã³ããªã®æåŸã«äžèŽãããµããªã¹ããåé€ãããŸãã
- ãã以å€ã®å ŽåãæŒç®ã®çµæã¯å·Šãªãã©ã³ãã®å€ã«ãªããŸãã
- ããªã²ãŒãç倿Œç®å (§12.15.9) ã«ãã£ãŠæ±ºå®ããããªã¹ããçããå Žåãæäœã®çµæã¯
ãªãã©ã³ãã®ãªã¹ãïŒããããã°ïŒã¯ãã©ã¡ããåŠçã®éçšã§å€æŽãããŸããã
äŸ:
delegate void D(int x); class C { public static void M1(int i) { ... } public static void M2(int i) { ... } } class Test { static void Main() { D cd1 = new D(C.M1); D cd2 = new D(C.M2); D list = null; list = null - cd1; // null list = (cd1 + cd2 + cd2 + cd1) - null; // M1 + M2 + M2 + M1 list = (cd1 + cd2 + cd2 + cd1) - cd1; // M1 + M2 + M2 list = (cd1 + cd2 + cd2 + cd1) - (cd1 + cd2); // M2 + M1 list = (cd1 + cd2 + cd2 + cd1) - (cd2 + cd2); // M1 + M1 list = (cd1 + cd2 + cd2 + cd1) - (cd2 + cd1); // M1 + M2 list = (cd1 + cd2 + cd2 + cd1) - (cd1 + cd1); // M1 + M2 + M2 + M1 list = (cd1 + cd2 + cd2 + cd1) - (cd1 + cd2 + cd2 + cd1); // null } }çµäºãµã³ãã«
- æåã®ãªãã©ã³ãã
äžèšã§å®çŸ©ãããŠããæªãªããã®å®çŸ©æžã¿æžç®æŒç®åã®ãªãã (§12.4.8) 圢åŒãäºåå®çŸ©ãããŠããŸãã
12.14 ã·ããæŒç®å
<<ã>>ãããã³>>>æŒç®åã¯ããããã·ããæŒç®ãå®è¡ããããã«äœ¿çšãããŸãã
shift_expression
: additive_expression
| shift_expression '<<' additive_expression
| shift_expression right_shift additive_expression
| shift_expression unsigned_right_shift additive_expression
;
shift_expression ã®ãªãã©ã³ãã«ã³ã³ãã€ã«æã®å dynamic ãããå ŽåãåŒã¯åçã«ãã€ã³ããããŸã (§12.3.3)ã ãã®å ŽåãåŒã®ã³ã³ãã€ã«æã®å㯠dynamicã§ãããã³ã³ãã€ã«æã®å dynamicãæã€ãªãã©ã³ãã®å®è¡æã®åã䜿çšããŠãå®è¡æã«ä»¥äžã§èª¬æãã解決ãè¡ãããŸãã
åçãã€ã³ãã£ã³ã°ã§ã¯ã enum System.Linq.Expressions.ExpressionType åã®å€ã䜿çšããŠããã€ããªæŒç®åã®çš®é¡ãã©ã³ã¿ã€ã ãã€ã³ããŒã«éä¿¡ããŸãã 笊å·ãªãå³ã·ããæŒç®åãå
·äœçã«è¡šãåæåã¡ã³ããŒããªãããã >>> ã®åçãã€ã³ãã£ã³ã°ã¯ãµããŒããããŠããŸããã
ãã©ãŒã x << countã x >> countããŸã㯠x >>> countã®æäœã§ã¯ã2 é
æŒç®åã®ãªãŒããŒããŒã解決 (§12.4.5) ãé©çšããŠãç¹å®ã®æŒç®åã®å®è£
ãéžæããŸãã å·ŠåŽã®ãªãã©ã³ãã¯å Tã«å€æãããŸããããã§ã T ã¯ããªãã©ã³ãã®äœ¿çšå¯èœãªãã¹ãŠã®å€ãå®å
šã«è¡šãããšãã§ãã intã uintã longãããã³ ulong ã®æåã®å€ã§ãã ãã®åŸã Tåã®æå¹æ¡æ°ã䜿çšããŠæäœãå®è¡ãããçµæã®åã TãããŸãã
ãªãŒããŒããŒããããã·ããæŒç®åã宣èšããå Žåãæåã®ãªãã©ã³ãã®åã¯ãåžžã«æŒç®å宣èšãå«ãã¯ã©ã¹ãŸãã¯æ§é äœã«ãªããŸãã
unsigned_right_shiftæŒç®å (>>>) ã¯ãåŒããªãŒã«ã¯ååšããŸããã
泚: 笊å·ä»ãåã«å¯Ÿããå®çŸ©æžã¿ã®
>>>æŒç®åã®ã»ãã³ãã£ã¯ã¹ã¯ã笊å·ãªãåã«å€æã远å ããã«æ£ç¢ºã«è¡šãããšã¯ã§ããŸããã æ³šé
å®çŸ©æžã¿ã®ã·ããæŒç®åãæ¬¡ã«ç€ºããŸãã
å·Šã·ãã:
int operator <<(int x, int count); uint operator <<(uint x, int count); nint operator <<(nint x, int count); nuint operator <<(nuint x, int count); long operator <<(long x, int count); ulong operator <<(ulong x, int count);ãã®
<<æŒç®åxã¯ã以äžã®ããã«èšç®ããããããæ°ã ãå·Šã«ã·ããããŸããçµæã®å
xã®ç¯å²å€ã®äžäœãããã¯ç Žæ£ãããæ®ãã®ãããã¯å·Šã«ã·ãããããäžäœã®ç©ºããããäœçœ®ã¯ãŒãã«èšå®ãããŸããå³ã·ãã:
int operator >>(int x, int count); uint operator >>(uint x, int count); nint operator >>(nint x, int count); nuint operator >>(nuint x, int count); long operator >>(long x, int count); ulong operator >>(ulong x, int count); int operator >>>(int x, int count); uint operator >>>(uint x, int count); nint operator >>>(nint x, int count); nuint operator >>>(nuint x, int count); long operator >>>(long x, int count); ulong operator >>>(ulong x, int count);>>æŒç®åã¯ãäžèšã«èª¬æããããã«èšç®ããããããæ°åã ããxãå³ã«ã·ããããŸããxãintãnintããŸãã¯longã®åã§ããå Žåãxã®äžäœãããã¯ç Žæ£ãããæ®ãã®ãããã¯å³ã«ã·ãããããxãè² ã§ãªãå Žåã¯äžäœã®ç©ºã®ãããäœçœ®ã 0 ã«èšå®ãããxãè² ã®å Žå㯠1 ã«èšå®ãããŸããxãuintãnuintããŸãã¯ulongã®åã§ããå Žåãxã®äžäœãããã¯ç Žæ£ãããæ®ãã®ãããã¯å³ã«ã·ãããããäžäœã®ç©ºã®ãããäœçœ®ã¯ 0 ã«èšå®ãããŸãã>>>æŒç®åã¯ã次ã®ããã«èšç®ããããããæ°ã ãå³xã·ããããŸããxã®äžäœãããã¯ç Žæ£ãããæ®ãã®ãããã¯å³ã«ã·ãããããäžäœã®ç©ºã®ãããäœçœ®ã¯ 0 ã«èšå®ãããŸãã
å®çŸ©æžã¿ã®æŒç®åã®å Žåãã·ãããããããæ°ã¯æ¬¡ã®ããã«èšç®ãããŸãã
-
xã®åãintãŸãã¯uintã®å Žåãã·ãã ã«ãŠã³ãã¯countã®äžäœ 5 ãããã«ãã£ãŠäžããããŸãã ã€ãŸããã·ãã ã«ãŠã³ãã¯count & 0x1Fããèšç®ãããŸãã ããã¯ãxã®åãnintãŸãã¯nuintã§ããããããã®åã®ãµã€ãºãšè¡šçŸããããããintããã³uintãšåãã§ããå Žåã«ãé©çšãããŸãã -
xã®åãlongãŸãã¯ulongã®å Žåãã·ãã ã«ãŠã³ãã¯countã®äžäœ 6 ãããã«ãã£ãŠäžããããŸãã ã€ãŸããã·ãã ã«ãŠã³ãã¯count & 0x3Fããèšç®ãããŸãã ããã¯ãxã®åãnintãŸãã¯nuintã§ããããããã®åã®ãµã€ãºãšè¡šçŸããããããlongããã³ulongãšåãã§ããå Žåã«ãé©çšãããŸãã
çµæã®ã·ãã ã«ãŠã³ãã 0 ã®å Žåãã·ããæŒç®åã¯åã« x ã®å€ãè¿ããŸãã
ã·ããæŒç®ãåå ã§ãªãŒããŒãããŒãçºçããããšã¯ãªããchecked ãš unchecked ã®ã³ã³ããã¹ãã§åãçµæãçæãããããšã¯ãããŸããã
>> æŒç®åã®å·Šãªãã©ã³ãã笊å·ä»ãæŽæ°åã®å ŽåãæŒç®åã¯å³ã«ç®è¡ã·ãã ãå®è¡ããŸããããã§ããªãã©ã³ãã®æäžäœãããïŒç¬Šå·ãããïŒã®å€ã¯ãé«äœã®ç©ºã®ãããäœçœ®ã«äŒéãããŸãã
>> æŒç®åã®å·Šãªãã©ã³ãã笊å·ãªãæŽæ°åã®å ŽåãæŒç®åã¯å³æ¹åã« è«ç ã·ãããå®è¡ããŸããããã§ãäžäœã®ç©ºã®ãããäœçœ®ã¯åžžã« 0 ã«èšå®ãããŸãã ãªãã©ã³ãåããæšè«ãããéã®æŒç®ãå®è¡ããã«ã¯ãæç€ºçãªãã£ã¹ãã䜿çšã§ããŸãã
äŸ:
xãintåã®å€æ°ã§ããå ŽåãæŒç®unchecked ((int)((uint)x >> y))ã¯xã®è«çã·ããå³ãå®è¡ããŸãã çµäºãµã³ãã«
äžèšã§å®çŸ©ãããŠãããªãããããŠããªãå®çŸ©æžã¿ã®ã·ããæŒç®åã®ãªãããããåœ¢åŒ (§12.4.8) ãäºåå®çŸ©ãããŠããŸãã
12.15 é¢ä¿æŒç®åãšåãã¹ãæŒç®å
12.15.1 å šè¬
==ã !=ã <ã >ã <=ã >=ã isãããã³ as æŒç®åã¯ããªã¬ãŒã·ã§ãã«æŒç®åãšåãã¹ãæŒç®åãšåŒã°ããŸãã
relational_expression
: shift_expression
| relational_expression '<' shift_expression
| relational_expression '>' shift_expression
| relational_expression '<=' shift_expression
| relational_expression '>=' shift_expression
| relational_expression 'is' type
| relational_expression 'is' pattern
| relational_expression 'as' type
;
equality_expression
: relational_expression
| equality_expression '==' relational_expression
| equality_expression '!=' relational_expression
;
"relational_expressiontype" ãš "isconstant_pattern" ã®äž¡æ¹ã®ä»£æ¿åè£ãé©çšãããåãã¢ã¯ã»ã¹å¯èœãªåã«è§£æ±ºãããå Žåã¯ãrelational_expression (is) ãèªèããå Žåã¯ã"relational_expressionis" ã®ä»£æ¿åè£ãéžæãããŸãã
isæŒç®å㯠§12.15.12 ã§èª¬æãããasæŒç®å㯠§12.15.13 ã§èª¬æãããŠããŸãã
==ã !=ã <ã >ã <= ããã³ >= ã®æŒç®åã¯ã æ¯èŒæŒç®åã§ãã
default_literal (§12.8.21) ã <ã >ã <=ããŸã㯠>= æŒç®åã®ãªãã©ã³ããšããŠäœ¿çšãããŠããå Žåãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
default_literal ã == ãŸã㯠!= æŒç®åã®äž¡æ¹ã®ãªãã©ã³ããšããŠäœ¿çšãããŠããå Žåãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
ãŸã㯠is æŒç®åã®å·Šãªãã©ã³ããšã㊠as ã䜿çšãããšãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
æ¯èŒæŒç®åã®ãªãã©ã³ãã«ã³ã³ãã€ã«æã®å dynamicãããå ŽåãåŒã¯åçã«ãã€ã³ããããŸã (§12.3.3)ã ãã®å ŽåãåŒã®ã³ã³ãã€ã«æã®å㯠dynamic ã§ãããã³ã³ãã€ã«æã®å dynamic ãæã€ãªãã©ã³ãã®å®è¡æã®åã䜿çšããŠãå®è¡æã«ä»¥äžã§èª¬æãã解決ãè¡ãããŸãã
ãã©ãŒã x «op» yã®æŒç®ã®å Žåã«op» ã¯æ¯èŒæŒç®åã§ããããªãŒããŒããŒãã®è§£æ±º (§12.4.5) ãé©çšãããç¹å®ã®æŒç®åã®å®è£
ãéžæãããŸãã ãªãã©ã³ãã¯éžæããæŒç®åã®ãã©ã¡ãŒã¿ãŒåã«å€æãããçµæã®åã¯æŒç®åã®æ»ãå€ã®åã«ãªããŸãã
equality_expression ã®äž¡æ¹ã®ãªãã©ã³ãã null ãªãã©ã«ã®å ŽåããªãŒããŒããŒãã®è§£æ±ºã¯å®è¡ããããæŒç®åã true ã false ãã«å¿ããŠãåŒã¯ == ãŸã㯠!= ã®å®æ°å€ã«è©äŸ¡ãããŸãã
å®çŸ©æžã¿ã®æ¯èŒæŒç®åã«ã€ããŠã¯ã次ã®ãµãã¯ããŒãºã§èª¬æããŸãã æ¬¡ã®è¡šã«ç€ºãããã«ãå®çŸ©æžã¿ã®ãã¹ãŠã®æ¯èŒæŒç®åã¯ããŒã«åã®çµæãè¿ããŸãã
| æäœ | çµæ |
|---|---|
x == y |
trueã xã«çããå Žå㯠y ãã以å€ã®å Žå㯠falseã |
x != y |
true ã x ãšçãããªãå Žå㯠yããã以å€ã®å Žå㯠falseã |
x < y |
true ã x ããå°ããå Žå㯠yããã以å€ã®å Žå㯠false |
x > y |
true ã x ãã倧ããå Žå㯠yããã以å€ã®å Žå㯠false |
x <= y |
true ã x 以äžã®å Žå㯠yããã以å€ã®å Žå㯠false |
x >= y |
true ã x 以äžã®å Žå㯠yããã以å€ã®å Žå㯠false |
12.15.2 æŽæ°æ¯èŒæŒç®å
å®çŸ©æžã¿ã®æŽæ°æ¯èŒæŒç®åã¯æ¬¡ã®ãšããã§ãã
bool operator ==(int x, int y);
bool operator ==(uint x, uint y);
bool operator ==(nint x, nint y);
bool operator ==(nuint x, nuint y);
bool operator ==(long x, long y);
bool operator ==(ulong x, ulong y);
bool operator !=(int x, int y);
bool operator !=(uint x, uint y);
bool operator !=(nint x, nint y);
bool operator !=(nuint x, nuint y);
bool operator !=(long x, long y);
bool operator !=(ulong x, ulong y);
bool operator <(int x, int y);
bool operator <(uint x, uint y);
bool operator <(nint x, nint y);
bool operator <(nuint x, nuint y);
bool operator <(long x, long y);
bool operator <(ulong x, ulong y);
bool operator >(int x, int y);
bool operator >(uint x, uint y);
bool operator >(nint x, nint y);
bool operator >(nuint x, nuint y);
bool operator >(long x, long y);
bool operator >(ulong x, ulong y);
bool operator <=(int x, int y);
bool operator <=(uint x, uint y);
bool operator <=(nint x, nint y);
bool operator <=(nuint x, nuint y);
bool operator <=(long x, long y);
bool operator <=(ulong x, ulong y);
bool operator >=(int x, int y);
bool operator >=(uint x, uint y);
bool operator >=(nint x, nint y);
bool operator >=(nuint x, nuint y);
bool operator >=(long x, long y);
bool operator >=(ulong x, ulong y);
ãããã®åæŒç®åã¯ã2 ã€ã®æŽæ°ãªãã©ã³ãã®æ°å€ãæ¯èŒããç¹å®ã®é¢ä¿ã bool ã true ãã瀺ã false å€ãè¿ããŸãã
äžèšã§å®çŸ©ãããŠããæªãªããã®æŽæ°æ¯èŒæŒç®åã®ãªãããããåœ¢åŒ (§12.4.8) ãäºåã«å®çŸ©ãããŠããŸãã
12.15.3 æµ®åå°æ°ç¹æ¯èŒæŒç®å
å®çŸ©æžã¿ã®æµ®åå°æ°ç¹æ¯èŒæŒç®åã¯æ¬¡ã®ãšããã§ãã
bool operator ==(float x, float y);
bool operator ==(double x, double y);
bool operator !=(float x, float y);
bool operator !=(double x, double y);
bool operator <(float x, float y);
bool operator <(double x, double y);
bool operator >(float x, float y);
bool operator >(double x, double y);
bool operator <=(float x, float y);
bool operator <=(double x, double y);
bool operator >=(float x, float y);
bool operator >=(double x, double y);
æŒç®åã¯ãIEC 60559 æšæºã®èŠåã«åŸã£ãŠãªãã©ã³ããæ¯èŒããŸãã
ããããã®ãªãã©ã³ãã NaN ã®å Žåãçµæã false ã® != 以å€ã®ãã¹ãŠã®æŒç®åã®çµæã true ã«ãªããŸãã 2 ã€ã®ãªãã©ã³ãã®å Žåã x != y ã¯åžžã« !(x == y)ãšåãçµæãçæããŸãã ãã ããäžæ¹ãŸãã¯äž¡æ¹ã®ãªãã©ã³ãã NaN ã®å Žåã<ã>ã<= ã®å Žåã>= æŒç®åã¯ãåå¯Ÿã®æŒç®åã®è«çåŠå®ãšåãçµæãçæããŸããã
äŸ:
xãšyã®ããããã NaN ã®å Žåãx < yã¯falseã§ããã!(x >= y)ã¯trueã§ãã çµäºãµã³ãã«
ã©ã¡ãã®ãªãã©ã³ãã NaN ã§ãªãå ŽåãæŒç®å㯠2 ã€ã®æµ®åå°æ°ç¹ãªãã©ã³ãã®å€ãé åºä»ããšæ¯èŒããŸã
-â < -max < ... < -min < -0.0 == +0.0 < +min < ... < +max < +â
ããã§ã min ãš max ã¯ãæå®ãããæµ®åå°æ°ç¹åœ¢åŒã§è¡šãããšãã§ããæå°ããã³æå€§ã®æ£ã®æéå€ã§ãã ãã®é åºã®äž»ãªåœ±é¿ã¯æ¬¡ã®ãšããã§ãã
- è² ã®ãŒããšæ£ã®ãŒãã¯çãããšèŠãªãããã
- è² ã®ç¡é倧ã¯ãä»ã®ãã¹ãŠã®å€ããå°ãããšèŠãªãããŸãããå¥ã®è² ã®ç¡é倧ãšçãããªããŸãã
- æ£ã®ç¡é倧ã¯ãä»ã®ãã¹ãŠã®å€ãã倧ãããšèŠãªãããŸãããå¥ã®æ£ã®ç¡é倧ãšçãããªããŸãã
äžèšã§å®çŸ©ãããŠããæªãªããã®å®çŸ©æžã¿æµ®åå°æ°ç¹æ¯èŒæŒç®åã®ãªãã (§12.4.8) 圢åŒãäºåå®çŸ©ãããŠããŸãã
12.15.4 10 鲿°æ¯èŒæŒç®å
å®çŸ©æžã¿ã® 10 鲿¯èŒæŒç®åã¯æ¬¡ã®ãšããã§ãã
bool operator ==(decimal x, decimal y);
bool operator !=(decimal x, decimal y);
bool operator <(decimal x, decimal y);
bool operator >(decimal x, decimal y);
bool operator <=(decimal x, decimal y);
bool operator >=(decimal x, decimal y);
ãããã®åæŒç®åã¯ã2 ã€ã®10é²ãªãã©ã³ãã®æ°å€ãæ¯èŒããç¹å®ã®é¢ä¿ã bool ã true ãã瀺ã false å€ãè¿ããŸãã å 10 鲿¯èŒã¯ã System.Decimalåã®å¯Ÿå¿ãããªã¬ãŒã·ã§ãã«æŒç®åãŸãã¯ç倿Œç®åã䜿çšããããšãšåãã§ãã
äžèšã§å®çŸ©ãããŠããæªãªããã®å®çŸ©æžã¿å°æ°æ¯èŒæŒç®åã®ãªãã (§12.4.8) 圢åŒãäºåå®çŸ©ãããŠããŸãã
12.15.5 ããŒã«ç倿Œç®å
å®çŸ©æžã¿ã®ããŒã«ç倿Œç®åã¯æ¬¡ã®ãšããã§ãã
bool operator ==(bool x, bool y);
bool operator !=(bool x, bool y);
== ãš true ã®äž¡æ¹ã x ã®å ŽåããŸã㯠y ãš true ã®äž¡æ¹ã x ã®å Žåã y ã®çµæã¯ false ã«ãªããŸãã ãã以å€ã®å Žåãçµæã¯ false ã§ãã
!= ãš false ã®äž¡æ¹ã x ã®å ŽåããŸã㯠y ãš true ã®äž¡æ¹ã x ã®å Žåã y ã®çµæã¯ false ã«ãªããŸãã ãã以å€ã®å Žåãçµæã¯ true ã§ãã ãªãã©ã³ãã boolåã®å Žåã != æŒç®å㯠^ æŒç®åãšåãçµæãçæããŸãã
äžèšã§å®çŸ©ãããæªãªããã®å®çŸ©æžã¿ããŒã«ç倿Œç®åã®ãªããããŒãžã§ã³ (§12.4.8) ãå®çŸ©æžã¿ã§ãã
12.15.6 åææ¯èŒæŒç®å
ãã¹ãŠã®åæåã¯ã次ã®å®çŸ©æžã¿ã®æ¯èŒæŒç®åãæé»çã«æäŸããŸãã
bool operator ==(E x, E y);
bool operator !=(E x, E y);
bool operator <(E x, E y);
bool operator >(E x, E y);
bool operator <=(E x, E y);
bool operator >=(E x, E y);
x «op» yãè©äŸ¡ããçµæ (x ãš y ã¯åºã«ãªãå E ãæã€åæå U ã®åŒã§ããã«op» ã¯æ¯èŒæŒç®åã® 1 ã€ã§ããã ((U)x) «op» ((U)y)ã®è©äŸ¡ãšãŸã£ããåãã§ãã ã€ãŸããåæåã®æ¯èŒæŒç®åã¯ãåã« 2 ã€ã®ãªãã©ã³ãã®åºã«ãªãæŽæ°å€ãæ¯èŒããŸãã
äžèšã§å®çŸ©ãããŠããæªãªããã®å®çŸ©æžã¿åææ¯èŒæŒç®åã®ãªãã (§12.4.8) 圢åŒãäºåå®çŸ©ãããŠããŸãã
12.15.7 åç §åã®ç倿Œç®å
ãã¹ãŠã®ã¯ã©ã¹å C ã¯ã次ã®å®çŸ©æžã¿ã®åç
§åã®ç倿Œç®åãæé»çã«æäŸããŸãã
bool operator ==(C x, C y);
bool operator !=(C x, C y);
å®çŸ©æžã¿ã®ç倿Œç®åã C ã«ååšããªãéã (ããšãã°ã C ã string ãŸã㯠System.Delegateã®å Žå)ã
äž¡æ¹ã®ãªãã©ã³ããã¬ã³ãŒã ã¯ã©ã¹ã§ããããäž¡æ¹ãéã¬ã³ãŒã ã¯ã©ã¹ã§ããå¿ èŠããããŸãã
æŒç®åã¯ãçãããçãããªããã® 2 ã€ã®åç §ãæ¯èŒããçµæãè¿ããŸãã
ã¬ã³ãŒã以å€ã®ã¯ã©ã¹ãªãã©ã³ãã®å Žåãoperator ==ã¯ãtrueãšxãåãã€ã³ã¹ã¿ã³ã¹ãåç
§ããŠããå ŽåããŸãã¯äž¡æ¹ãyå Žåã«ã®ã¿nullãè¿ããŸãããoperator !=ã¯ãåããªãã©ã³ããæã€trueãoperator ==ãè¿ãå Žåã«ã®ã¿falseãè¿ããŸãã
ã¬ã³ãŒã ã¯ã©ã¹ ãªãã©ã³ãã®å Žåãoperator ==ã¯ã2 ã€ã®ã¬ã³ãŒã ã¯ã©ã¹ãšãã®åºåºã¬ã³ãŒã ã¯ã©ã¹å
ã®ãã¹ãŠã®å¯Ÿå¿ããã€ã³ã¹ã¿ã³ã¹ ãã£ãŒã«ãã®å€ãçããå ŽåããŸãã¯äž¡æ¹ã®åç
§ãtrueå Žåã«ã®ã¿nullãè¿ããŸãããåããªãã©ã³ããæã€operator !=ãtrueãè¿ãå Žåã«ã®ã¿ãoperator ==ã¯falseãè¿ããŸãã
æšæºã®é©çšèŠå (§12.6.4.2) ã«å ããŠãå®çŸ©æžã¿ã®åç §åã®ç倿Œç®åãé©çšããã«ã¯ã次ã®ãããããå¿ èŠã§ãã
- ã©ã¡ãã®ãªãã©ã³ããã reference_type ãŸãã¯ãªãã©ã«
nullã§ããããšãç¥ãããŠããåã®å€ã§ãã ããã«ãããããã®ãªãã©ã³ããã仿¹ã®ãªãã©ã³ãã®åã«å¯Ÿãã ID ãŸãã¯æç€ºçãªåç §å€æ (§10.3.5) ãååšããŸãã - äžæ¹ã®ãªãã©ã³ãã¯ãªãã©ã«
nullã§ããã 1 ã€ã®ãªãã©ã³ãã¯Tåã®å€ã§ããããã§ãTã¯å€åãšã¯èªèããããå€åå¶çŽãæããªã type_parameter ã§ãã- å®è¡æ
Tã null é蚱容å€åã®å Žåã==ã®çµæã¯falseããã!=ã®çµæã¯trueã§ãã - å®è¡æ
Tã null 蚱容å€åã®å Žåãçµæã¯ãªãã©ã³ãã®HasValueããããã£ããèšç®ãããŸã (§12.15.10)ã - å®è¡æã«
Tãåç §åã®å Žåããªãã©ã³ããtrueã§ããã°çµæã¯nullã«ãªãããã以å€ã®å Žåã¯falseã«ãªããŸãã
- å®è¡æ
ãããã®æ¡ä»¶ã®ãããããåœãŠã¯ãŸãå Žåãé€ãããã€ã³ãæãšã©ãŒãçºçããŸãã
泚æ: ãããã®ã«ãŒã«ã®äž»ãªåœ±é¿ã¯æ¬¡ã®ãšããã§ãã
- å®çŸ©æžã¿ã®åç §åã®ç倿Œç®åã䜿çšããŠããã€ã³ãæã«ç°ãªãããšãããã£ãŠãã 2 ã€ã®åç §ãæ¯èŒããã®ã¯ããã€ã³ãæãšã©ãŒã§ãã ããšãã°ããªãã©ã³ãã®ãã€ã³ãã£ã³ã°æã®åã 2 ã€ã®ã¯ã©ã¹åã§ãããã©ã¡ãã仿¹ããæŽŸçããŠããªãå Žåã2 ã€ã®ãªãã©ã³ããåããªããžã§ã¯ããåç §ããããšã¯ã§ããŸããã ãããã£ãŠãæŒç®ã¯ãã€ã³ãæãšã©ãŒãšèŠãªãããŸãã
- å®çŸ©æžã¿ã®åç §åã®ç倿Œç®åã§ã¯ãå€åãªãã©ã³ãã®æ¯èŒã¯èš±å¯ãããŸãã (åãã©ã¡ãŒã¿ãŒãç¹å¥ã«åŠçããã
nullãšæ¯èŒãããå Žåãé€ã)ã- å®çŸ©æžã¿ã®åç §åã®ç倿Œç®åã®ãªãã©ã³ãã¯ããã¯ã¹åãããŸããã æ°ããå²ãåœãŠãããããã¯ã¹åãããã€ã³ã¹ã¿ã³ã¹ãžã®åç §ã¯ãå¿ ãããä»ã®ãã¹ãŠã®åç §ãšç°ãªãããããã®ãããªããã¯ã¹åæŒç®ãå®è¡ããããšã¯æå³ããããŸããã
ãã©ãŒã
x == yãŸãã¯x != yã®æŒç®ã§ã該åœãããŠãŒã¶ãŒå®çŸ©ã®operator ==ãŸãã¯operator !=ãååšããå ŽåãæŒç®åãªãŒããŒããŒã解決èŠå (§12.4.5) ã¯ãå®çŸ©æžã¿ã®åç §åã®ç倿Œç®åã§ã¯ãªãããã®æŒç®åãéžæããŸãã ãªãã©ã³ãã®äžæ¹ãŸãã¯äž¡æ¹ãåobjectã«æç€ºçã«ãã£ã¹ãããããšã§ãåžžã«å®çŸ©æžã¿ã®åç §åã®ç倿Œç®åãéžæã§ããŸããæ³šé
äŸ: 次ã®äŸã§ã¯ãå¶çŽã®ãªãåãã©ã¡ãŒã¿ãŒåã®åŒæ°ã
nullãããŠãããã©ããã確èªããŸããclass C<T> { void F(T x) { if (x == null) { throw new ArgumentNullException(); } ... } }
x == nullã³ã³ã¹ãã©ã¯ãã¯ãTã null é蚱容å€åã衚ãããšãã§ããå Žåã§ãèš±å¯ãããfalseã null é蚱容å€åã®å Žåã«Tããããã«çµæãåçŽã«å®çŸ©ãããŸããçµäºãµã³ãã«
ãã©ãŒã x == y ãŸã㯠x != yã®æŒç®ã§ã該åœãããŠãŒã¶ãŒå®çŸ©ã® operator == ãŸã㯠operator != ãååšããå ŽåãæŒç®åãªãŒããŒããŒã解決 (§12.4.5) èŠåã¯ãå®çŸ©æžã¿ã®åç
§åã®ç倿Œç®åã§ã¯ãªãããã®æŒç®åãéžæããŸãã
泚: äž¡æ¹ã®ãªãã©ã³ããæç€ºçã«å
objectã«ãã£ã¹ãããããšã§ãå®çŸ©æžã¿ã®åç §åç倿Œç®åãéžæããããšãåžžã«å¯èœã§ãã æ³šé
äŸ: ãã®äŸ
class Test { static void Main() { string s = "Test"; string t = string.Copy(s); Console.WriteLine(s == t); Console.WriteLine((object)s == t); Console.WriteLine(s == (object)t); Console.WriteLine((object)s == (object)t); } }åºåãçæããŸãã
True False False False
s倿°ãšt倿°ã¯ãåãæåãå«ã 2 ã€ã®ç°ãªãæååã€ã³ã¹ã¿ã³ã¹ãåç §ããŸãã æåã®æ¯èŒã§ã¯ãäž¡æ¹ã®ãªãã©ã³ããTrueåã®å Žåã«å®çŸ©æžã¿ã®æååç倿Œç®å (§12.15.8) ãéžæãããŠãããããstringåºåãããŸãã æ®ãã®æ¯èŒã®ãã¹ãŠã¯ãFalseãåºåããŸãããªããªããoperator ==åã®stringã®ãªãŒããŒããŒãã¯ãããããã®ãªãã©ã³ãããã€ã³ãæåã®objectãæã£ãŠããå Žåã«ã¯é©çšãããªãããã§ããäžèšã®ææ³ã¯ãå€åã§ã¯æå³ãæããªãããšã«æ³šæããŠãã ããã äŸ
class Test { static void Main() { int i = 123; int j = 123; Console.WriteLine((object)i == (object)j); } }ã¯ã
FalseãåºåããŸããããã¯ãã£ã¹ããããã¯ã¹åãããintå€ã® 2 ã€ã®åå¥ã€ã³ã¹ã¿ã³ã¹ãžã®åç §ãäœæããããã§ããçµäºãµã³ãã«
12.15.8 æååç倿Œç®å
å®çŸ©æžã¿ã®æååç倿Œç®åã¯æ¬¡ã®ãšããã§ãã
bool operator ==(string x, string y);
bool operator !=(string x, string y);
次ã®ãããããåœãŠã¯ãŸãå Žåã2 ã€ã® string å€ãçãããšèŠãªãããŸãã
- ã©ã¡ãã®å€ã
nullã§ãã - ã©ã¡ãã®å€ããåæåäœçœ®ã«åãé·ããšåãæåãæã€æååã€ã³ã¹ã¿ã³ã¹ãžã®é
nullåç §ã§ãã
æååã®ç倿Œç®åã¯ãæåååç §ã§ã¯ãªãæååå€ãæ¯èŒããŸãã 2 ã€ã®åå¥ã®æååã€ã³ã¹ã¿ã³ã¹ã«ãŸã£ããåãæåã·ãŒã±ã³ã¹ãå«ãŸããŠããå Žåãæååã®å€ã¯çãããªããŸãããåç §ã¯ç°ãªããŸãã
泚: §12.15.7 ã§èª¬æãããŠããããã«ãåç §åã®ç倿Œç®åã䜿çšããŠãæååå€ã®ä»£ããã«æåååç §ãæ¯èŒã§ããŸãã æ³šé
12.15.9 ç倿Œç®åãå§ä»»ãã
å®çŸ©æžã¿ã®ããªã²ãŒãç倿Œç®åã¯æ¬¡ã®ãšããã§ãã
bool operator ==(System.Delegate x, System.Delegate y);
bool operator !=(System.Delegate x, System.Delegate y);
2 ã€ã®ããªã²ãŒã ã€ã³ã¹ã¿ã³ã¹ã¯ã次ã®ããã«çãããšèŠãªãããŸãã
- ããããã®ããªã²ãŒã ã€ã³ã¹ã¿ã³ã¹ã
nullã§ããå Žåãäž¡æ¹ãnullã§ããå Žåã«ã®ã¿ããããã¯çãããªããŸãã - ããªã²ãŒãã«ãç°ãªãå®è¡æã®åãããå Žåãããããçãããªãããšã¯ãããŸããã
- äž¡æ¹ã®ããªã²ãŒã ã€ã³ã¹ã¿ã³ã¹ã«åŒã³åºããªã¹ã (§21.2) ãããå Žåããããã®ã€ã³ã¹ã¿ã³ã¹ã¯ãåŒã³åºããªã¹ããåãé·ãã§ããã1 ã€ã®åŒã³åºããªã¹ãå ã®åãšã³ããªã察å¿ãããšã³ã㪠(以äžã§å®çŸ©) ãšçããå Žåã«ã®ã¿ã仿¹ã®åŒã³åºããªã¹ãå ã®é åºã§çãããªããŸãã
次ã®èŠåã¯ãåŒã³åºããªã¹ã ãšã³ããªã®ç䟡æ§ãå¶åŸ¡ããŸãã
- 2 ã€ã®åŒã³åºããªã¹ã é ç®ãäž¡æ¹ãšãåãéçã¡ãœãããåç §ããŠããå Žåãé ç®ã¯çãããªããŸãã
- 2 ã€ã®åŒã³åºããªã¹ã ãšã³ããªãäž¡æ¹ãšãåãã¿ãŒã²ãã ãªããžã§ã¯ãã§åãééçã¡ãœãããåç §ããŠããå Žå (åç §ç倿Œç®åã§å®çŸ©ãããŠããå Žå)ããšã³ããªã¯çãããªããŸãã
- ãã£ããã£ãããå€éšå€æ°ã€ã³ã¹ã¿ã³ã¹ã®åã (空ã®å¯èœæ§ããã) ã»ãããæã€ã»ãã³ãã£ãã¯ã«åäžã®å¿å颿° (§12.22) ã®è©äŸ¡ããçæãããåŒã³åºããªã¹ã ãšã³ããªã¯ãçãã (ãã ãå¿ èŠãããŸãã) èš±å¯ãããŸãã
æŒç®åã®ãªãŒããŒããŒã解決ãããããã®ããªã²ãŒãç倿Œç®åã«è§£æ±ºãããäž¡æ¹ã®ãªãã©ã³ãã®ãã€ã³ãæåããã§ã¯ãªãSystem.Delegate ã§èª¬æãããŠããããªã²ãŒãåã§ããããã€ã³ãåãªãã©ã³ãåéã« ID 倿ããªãå Žåããã€ã³ãæãšã©ãŒãçºçããŸãã
泚æ: ãã®èŠåã¯ãç°ãªãçš®é¡ã®ããªã²ãŒãåã€ã³ã¹ã¿ã³ã¹ãåç §ãããããé
nullå€ãçãããšèŠãªãããšãã§ããªãæ¯èŒãé²ãããã®ãã®ã§ãã æ³šé
12.15.10 null 蚱容å€åãš null ãªãã©ã«éã®ç倿Œç®å
äºåå®çŸ©ãããæŒç®åããŠãŒã¶ãŒå®çŸ©ã®æŒç®åã (æªãªãããŸãã¯ãªãã圢åŒã«) ãã®æäœã«ãªãå Žåã§ãã== ããã³ != æŒç®åã¯ããããªãã©ã³ãã null 蚱容å€åã®å€ã«ããŠãå¥ã®ãªãã©ã³ãã null ãªãã©ã«ã«ããããšãã§ããŸãã
ããããã®ãã©ãŒã ã®æŒç®ã®å Žå
x == null null == x x != null null != x
ããã§ã x 㯠null 蚱容å€åã®åŒã§ããæŒç®åãªãŒããŒããŒãã®è§£æ±º (§12.4.5) ã該åœããæŒç®åãèŠã€ããããªãã£ãå Žåãçµæã¯ä»£ããã« HasValue ã® x ããããã£ããèšç®ãããŸãã å
·äœçã«ã¯ãæåã® 2 ã€ã®ãã©ãŒã 㯠!x.HasValueã«å€æãããæåŸã® 2 ã€ã®ãã©ãŒã 㯠x.HasValueã«å€æãããŸãã
12.15.11 ã¿ãã«ç倿Œç®å
ã¿ãã«ç倿Œç®åã¯ãã¿ãã« ãªãã©ã³ãã®èŠçŽ ã«æ§æé ã«ãã¢ã¯ã€ãºã§é©çšãããŸãã
x æŒç®åãŸã㯠y æŒç®åã®åãªãã©ã³ã == ãš != ãã¿ãã«ãŸãã¯ã¿ãã«å (§8.3.11) ã®å€ãšããŠåé¡ãããå ŽåãæŒç®å㯠ã¿ãã«ç䟡æŒç®åã§ãã
ãªãã©ã³ã e ãã¿ãã«ãšããŠåé¡ãããŠããå Žåã eâ...eâ èŠçŽ ã¯ã¿ãã« ãªãã©ã«ã®èŠçŽ åŒãè©äŸ¡ããçµæã«ãªããŸãã ãã以å€ã®å Žåã e ãã¿ãã«åã®å€ã§ããå ŽåãèŠçŽ ã¯ t.Item1...t.Itemn ãšãªãã t 㯠e ãè©äŸ¡ããçµæãšãªããŸãã
ã¿ãã«ç倿Œç®åã®ãªãã©ã³ã x ãš y ã¯åãã¢ãªãã£ãæã€å¿
èŠããããŸãããŸãã¯ãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã èŠçŽ xáµ¢ ãš yáµ¢ã®åãã¢ã«å¯ŸããŠãåãç倿Œç®åãé©çšããã boolã dynamicã boolãžã®æé»çãªå€æãæã€åããŸã㯠true æŒç®åãš false æŒç®åãå®çŸ©ããåã®çµæãåŸãããŸãã
ã¿ãã«ç倿Œç®å x == y ã¯ã次ã®ããã«è©äŸ¡ãããŸãã
- å·ŠåŽã®ãªãã©ã³ã
xãè©äŸ¡ãããŸãã - å³åŽã®ãªãã©ã³ã
yãè©äŸ¡ãããŸãã - èŸæžåŒé åºã§
xáµ¢ããã³yáµ¢èŠçŽ ã®ãã¢ããšã«ã- æŒç®å
xáµ¢ == yáµ¢ãè©äŸ¡ãããboolåã®çµæã次ã®ããã«ååŸãããŸãã- æ¯èŒã«ãã£ãŠ
boolãçæãããå Žåããããçµæã«ãªããŸãã - ãã以å€ã®å Žåãæ¯èŒã«ãã£ãŠ
dynamicãçæãããå ŽåãæŒç®åfalseãåçã«åŒã³åºãããçµæã®boolå€ã¯è«çåŠå®æŒç®å (!) ã§åŠå®ãããŸãã - ãã以å€ã®å Žåãæ¯èŒã®åã«
boolãžã®æé»çãªå€æãããå Žåããã®å€æãé©çšãããŸãã - ãã以å€ã®å Žåãæ¯èŒã®åã«æŒç®å
falseãããå Žåããã®æŒç®åãåŒã³åºãããçµæã®boolå€ã¯è«çåŠå®æŒç®å (!) ã§åŠå®ãããŸãã
- æ¯èŒã«ãã£ãŠ
- çµæã®
boolãfalseã§ããå Žåããã以äžã®è©äŸ¡ã¯è¡ããããã¿ãã«ç倿Œç®åã®çµæã¯falseãšãªããŸãã
- æŒç®å
- ãã¹ãŠã®èŠçŽ ã®æ¯èŒã®çµæã
trueãè¿ããå Žåãã¿ãã«ç䟡æŒç®åã®çµæã¯trueã«ãªããŸãã
ã¿ãã«ç倿Œç®å x != y ã¯ã次ã®ããã«è©äŸ¡ãããŸãã
- å·ŠåŽã®ãªãã©ã³ã
xãè©äŸ¡ãããŸãã - å³åŽã®ãªãã©ã³ã
yãè©äŸ¡ãããŸãã - èŸæžåŒé åºã§
xáµ¢ããã³yáµ¢èŠçŽ ã®ãã¢ããšã«ã- æŒç®å
xáµ¢ != yáµ¢ãè©äŸ¡ãããboolåã®çµæã次ã®ããã«ååŸãããŸãã- æ¯èŒã«ãã£ãŠ
boolãçæãããå Žåããããçµæã«ãªããŸãã - ãã以å€ã®å Žåãæ¯èŒã«ãã£ãŠ
dynamicãçæãããå ŽåãæŒç®åtrueãåçã«åŒã³åºãããçµæã®boolå€ãçµæã«ãªããŸãã - ãã以å€ã®å Žåãæ¯èŒã®åã«
boolãžã®æé»çãªå€æãããå Žåããã®å€æãé©çšãããŸãã - ãã以å€ã®å Žåãæ¯èŒã®åã«æŒç®å
trueãããå Žåããã®æŒç®åãåŒã³åºãããçµæã®boolå€ãçµæã«ãªããŸãã
- æ¯èŒã«ãã£ãŠ
- çµæã®
boolãtrueã§ããå Žåããã以äžã®è©äŸ¡ã¯è¡ããããã¿ãã«ç倿Œç®åã®çµæã¯trueãšãªããŸãã
- æŒç®å
- ãã¹ãŠã®èŠçŽ ã®æ¯èŒã®çµæã
falseãè¿ããå Žåãã¿ãã«ç䟡æŒç®åã®çµæã¯falseã«ãªããŸãã
12.15.12 Is æŒç®å
is æŒç®åã«ã¯ 2 ã€ã®åœ¢åŒããããŸãã ã²ãšã€ã¯ãis-type operator ã§ãå³åŽã«åããããŸãã ããã²ãšã€ã¯ãis-pattern operator ã§ãå³åŽã«ãã¿ãŒã³ããããŸãã
12.15.12.1 is-type æŒç®å
is-type æŒç®å ã¯ããªããžã§ã¯ãã®å®è¡æã®åãç¹å®ã®åãšäºææ§ããããã©ããã確èªããããã«äœ¿çšãããŸãã ãã§ãã¯ã¯å®è¡æã«å®è¡ãããŸãã
E is T ãåŒã§ããã E ã T以å€ã®åã§ããæŒç® dynamicã®çµæã¯ã E ã null 以å€ã§ãããåç
§å€æãããã¯ã¹å倿ãããã¯ã¹åè§£é€å€æãã©ããè§£é€å€æã«ãã£ãŠ T åã«æ£åžžã«å€æã§ãããã©ããã瀺ãããŒã«å€ã§ãã
æäœ E is T ã¯æ¬¡ã®ããã«è©äŸ¡ãããŸãã
-
Eãå¿å颿°ãŸãã¯ã¡ãœãã ã°ã«ãŒãã®å Žåã¯ãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã -
Tã null 蚱容åç §å (§8.9.3) ã®å Žåãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã -
Eãnullãªãã©ã«ã®å ŽåããŸãã¯Eã®å€ãnullã§ããå Žåãçµæã¯falseãšãªããŸãã - ãã以å€ã®å Žå:
-
RãEã®ã©ã³ã¿ã€ã åã«ããŸãããã -
Dåãæ±ºå®ããŸããRã null 蚱容å€åã®å ŽåãDã¯ãã®åºã«ãªãåã§ãããã以å€ã®å ŽåãDã¯RãšçãããªããŸãã - çµæã¯ã次ã®ããã«
DãšTã«ãã£ãŠç°ãªããŸãã-
Tãåç §åã§ããã°ã以äžã®å Žåã«çµæã¯trueãšãªããŸãã-
DãšTã®éã« ID 倿ãååšããããŸã㯠-
Dã¯åç §åã§ãããDããTãžã®æé»çãªåç §å€æãååšããããŸã㯠-
Dã¯å€åã§ãããDããTãžã®ããã¯ã¹å倿ãååšããŸãã
-
-
Tã null 蚱容å€åã®å ŽåãtrueãDã®åºã«ãªãåã§ããã°ãçµæã¯TãšãªããŸãã -
Tã null é蚱容å€åã®å ŽåãtrueãšDãåãåã®å Žåãçµæã¯TãšãªããŸãã - ãã以å€ã®å Žåãçµæã¯
falseã§ãã
-
-
ãŠãŒã¶ãŒå®çŸ©ã®å€æã¯ã is æŒç®åããã¯èæ
®ãããŸããã
泚æ:
isæŒç®åã¯å®è¡æã«è©äŸ¡ãããããããã¹ãŠã®ååŒæ°ã眮æãããŠãããèæ ®ãã¹ããªãŒãã³å (§8.4.3) ã¯ãããŸããã æ³šé
泚æ:
isæŒç®åã¯ã次ã®ããã«ã³ã³ãã€ã«æã®åãšå€æã®èгç¹ããçè§£ã§ããŸããããã§ãCã¯Eã®ã³ã³ãã€ã«æã®åã§ãã
eã®ã³ã³ãã€ã«æã®åãTãšåãã§ããå ŽåããŸã㯠ã®ã³ã³ãã€ã«æã®åãã ãžã®æé»çãªåç §å€æ (§10.2.8)ãããã¯ã¹å倿 (§10.2.9)ãã©ããã³ã°å€æ (E)ããŸãã¯æç€ºçãªã¢ã³ã©ããã³ã°å€æ (T) ãååšããå Žå:
Cã null é蚱容å€åã®å ŽåãæŒç®ã®çµæã¯trueãšãªããŸãã- ãã以å€ã®å ŽåãæŒç®ã®çµæã¯
E != nullã®è©äŸ¡ãšåãã§ãã- ãã以å€ã®å Žåãæç€ºçãªåç §å€æ (§10.3.5) ãŸãã¯ããã¯ã¹åè§£é€å€æ (§10.3.7) ã
CããTã«ååšããå ŽåããŸãã¯CãŸãã¯TããªãŒãã³å (§8.4.3) ã®å Žåã¯ãäžèšã®ã©ã³ã¿ã€ã ãã§ãã¯ãå®è¡ãããŸãã- ãã以å€ã®å Žåã¯ã
EããåTãžã®åç §ãããã¯ã¹åãæãè¿ãããŸãã¯ã©ããè§£é€ã®å€æã¯ã§ãããæŒç®ã®çµæã¯falseãšãªããŸãã ã³ã³ãã€ã©ã¯ãã³ã³ãã€ã«æã®åã«åºã¥ããŠæé©åãå®è£ ã§ããŸããæ³šé
12.15.12.2 is-pattern æŒç®å
is-pattern æŒç®å ã¯ãåŒ ã«ãã£ãŠèšç®ãããå€ãç¹å®ã®ãã¿ãŒã³ (§11) ãš äžèŽãã ãã©ããã確èªããããã«äœ¿çšãããŸãã ãã§ãã¯ã¯å®è¡æã«å®è¡ãããŸãã å€ããã¿ãŒã³ãšäžèŽããå Žåãis-pattern æŒç®åã®çµæã¯ true ã«ãªããŸãããã以å€ã®å Žå㯠false ã§ãã
ãã©ãŒã E is Pã®åŒã®å Žå(ããã§ E 㯠T åã®é¢ä¿åŒã§ã P ã¯ãã¿ãŒã³ã§ããæ¬¡ã®ãããããä¿æãããŠããå Žåãã³ã³ãã€ã«æãšã©ãŒã«ãªããŸãã
-
Eã¯å€ãæå®ããªãããåãæã£ãŠããŸããã - ãã¿ãŒã³
Pã¯ã å ã«é©çšã§ããŸãã (T)ã
ãã¿ãŒã³ã®ãã¹ãŠã®single_variable_designationã§ã¯ã察å¿ããrelational_expressionãã¹ããããããšãã«ç¢ºå®ã«å²ãåœãŠãããæ°ããããŒã«ã«å€æ° (true) ãå°å
¥ãããŸã (§9.4.4.34)ã
12.15.13 as æŒç®å
as æŒç®åã¯ãå€ãç¹å®ã®åç
§åãŸã㯠null 蚱容å€åã«æç€ºçã«å€æããããã«äœ¿çšãããŸãã ãã£ã¹ãåŒ (§12.9.8) ãšã¯ç°ãªãã as æŒç®åã¯äŸå€ãã¹ããŒããŸããã 代ããã«ãæå®ããã倿ãäžå¯èœãªå Žåãçµæã®å€ã¯ nullã§ãã
åœ¢åŒ E as T ã®æŒç®ã§ã¯ã E ã¯åŒã§ããã T ã¯åç
§åãåç
§åãšããŠèªèãããŠããåãã©ã¡ãŒã¿ãŒããŸã㯠null 蚱容å€åã§ããå¿
èŠããããŸãã ããã«ã次ã®ãã¡å°ãªããšã 1 ã€ã true ã§ãããããã以å€ã®å Žåã¯ã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
- èå¥å (§10.2.2)ãæé»çãªnullable (§10.2.6)ãæé»çåç
§ (§10.2.8)ãããã¯ã¹å (§10.2.9)ãæç€ºçãªnullable (§10.3.4)ãæç€ºçåç
§ (§10.3.5)ããŸãã¯ã©ããã³ã°å€æ (§8.3.12) ã
EããTãžã®å€æãšããŠååšããŸãã -
EãŸãã¯Tã®åã¯éããŠããåã§ãã -
Eã¯nullã®ãªãã©ã«ã§ãã
E ã®ã³ã³ãã€ã«æã®åã dynamicã§ãªãå ŽåãæŒç® E as T ã¯ä»¥äžãšåãçµæãçæããŸã
E is T ? (T)(E) : (T)null
ãã ããE ãè©äŸ¡ãããã®ã¯ 1 åã ãã§ãã ã³ã³ãã€ã©ã¯ãäžèšã®æ¡åŒµã«ãã£ãŠç€ºããã 2 ã€ã®ã©ã³ã¿ã€ã åãã§ãã¯ãšã¯å¯Ÿç
§çã«ãæå€§ 1 ã€ã®ã©ã³ã¿ã€ã åãã§ãã¯ãå®è¡ããããã« E as T ãæé©åããããšãæåŸ
ã§ããŸãã
ãã£ã¹ãæŒç®åãšã¯ç°ãªãã E ã®ã³ã³ãã€ã«æã®åã dynamicã§ããå Žåã as æŒç®åã¯åçã«ãã€ã³ããããŸãã (§12.3.3)ã ãããã£ãŠããã®å Žåã®æ¡åŒµã¯æ¬¡ã®ãšããã§ãã
E is T ? (T)(object)(E) : (T)null
ãŠãŒã¶ãŒå®çŸ©å€æãªã©ã®äžéšã®å€æã¯ã as æŒç®åã§ã¯å®è¡ã§ããªãããã代ããã«ãã£ã¹ãåŒã䜿çšããŠå®è¡ããå¿
èŠãããããšã«æ³šæããŠãã ããã
äŸ: ãã®äŸã§ã¯
class X { public string F(object o) { return o as string; // OK, string is a reference type } public T G<T>(object o) where T : Attribute { return o as T; // Ok, T has a class constraint } public U H<U>(object o) { return o as U; // Error, U is unconstrained } }
Tã®åãã©ã¡ãŒã¿ãŒGã¯ãã¯ã©ã¹å¶çŽããããããåç §åã§ããããšãããã£ãŠããŸãã ãã ããUã®åãã©ã¡ãŒã¿ãŒHã¯ãããŸããããã®ãããasã§ã®HæŒç®åã®äœ¿çšã¯èš±å¯ãããŸãããçµäºãµã³ãã«
12.16 è«çæŒç®å
12.16.1 å šè¬
&ã^ãããã³ | æŒç®åã¯è«çæŒç®åãšåŒã°ããŸãã
and_expression
: equality_expression
| and_expression '&' equality_expression
;
exclusive_or_expression
: and_expression
| exclusive_or_expression '^' and_expression
;
inclusive_or_expression
: exclusive_or_expression
| inclusive_or_expression '|' exclusive_or_expression
;
è«çæŒç®åã®ãªãã©ã³ãã«ã³ã³ãã€ã«æã®å dynamicãããå ŽåãåŒã¯åçã«ãã€ã³ããããŸã (§12.3.3)ã ãã®å ŽåãåŒã®ã³ã³ãã€ã«æã®å㯠dynamic ã§ãããã³ã³ãã€ã«æã®å dynamic ãæã€ãªãã©ã³ãã®å®è¡æã®åã䜿çšããŠãå®è¡æã«ä»¥äžã§èª¬æãã解決ãè¡ãããŸãã
ãã©ãŒã x «op» yã®æŒç®ïŒãopãã¯è«çæŒç®åã®1ã€ïŒã®å ŽåããªãŒããŒããŒãã®è§£æ±ºïŒÂ§12.4.5ïŒãé©çšãããç¹å®ã®æŒç®åã®å®è£
ãéžæãããŸãã ãªãã©ã³ãã¯éžæããæŒç®åã®ãã©ã¡ãŒã¿ãŒåã«å€æãããçµæã®åã¯æŒç®åã®æ»ãå€ã®åã«ãªããŸãã
å®çŸ©æžã¿ã®è«çæŒç®åã«ã€ããŠã¯ã次ã®ãµãã¯ããŒãºã§èª¬æããŸãã
12.16.2 æŽæ°è«çæŒç®å
å®çŸ©æžã¿ã®æŽæ°è«çæŒç®åã¯æ¬¡ã®ãšããã§ãã
int operator &(int x, int y);
uint operator &(uint x, uint y);
nint operator &(nint x, nint y);
nuint operator &(nuint x, nuint y);
long operator &(long x, long y);
ulong operator &(ulong x, ulong y);
int operator |(int x, int y);
uint operator |(uint x, uint y);
nint operator |(nint x, nint y);
nuint operator |(nuint x, nuint y);
long operator |(long x, long y);
ulong operator |(ulong x, ulong y);
int operator ^(int x, int y);
uint operator ^(uint x, uint y);
nint operator ^(nint x, nint y);
nuint operator ^(nuint x, nuint y);
long operator ^(long x, long y);
ulong operator ^(ulong x, ulong y);
& æŒç®åã¯ã2 ã€ã®ãªãã©ã³ãã®ãããããšã®è«ç AND ãèšç®ãã | æŒç®å㯠2 ã€ã®ãªãã©ã³ãã®ãããããšã®è«ç OR ãèšç®ãã ^ æŒç®å㯠2 ã€ã®ãªãã©ã³ãã®ãããããšã®è«çæä»ç OR ãèšç®ããŸãã ãããã®æŒç®ããã®ãªãŒããŒãããŒã¯çºçããŸããã
äžèšã§å®çŸ©ãããŠããæªãªããã®å®çŸ©æžã¿æŽæ°è«çæŒç®åã®ãªããããã (§12.4.8) 圢åŒããããããå®çŸ©ãããŠããŸãã
12.16.3 åæè«çæŒç®å
ãã¹ãŠã®åæå E ã¯ã次ã®å®çŸ©æžã¿ã®è«çæŒç®åãæé»çã«æäŸããŸãã
E operator &(E x, E y);
E operator |(E x, E y);
E operator ^(E x, E y);
x «op» y ãè©äŸ¡ããçµæã¯ã x ãš y ãåºç€å E ãæã€åæå U ã®åŒã§ããã«op» ãè«çæŒç®åã® 1 ã€ã§ããå Žåã (E)((U)x «op» (U)y) ãè©äŸ¡ããçµæãšãŸã£ããåãã«ãªããŸãã ã€ãŸããåæåã®è«çæŒç®åã¯ã2 ã€ã®ãªãã©ã³ãã®åºã«ãªãåã«å¯ŸããŠè«çæŒç®ãå®è¡ããã ãã§ãã
äžèšã§å®çŸ©ãããŠããæªãªããã®å®çŸ©æžã¿åæè«çæŒç®åã®ãªãããããåœ¢åŒ (§12.4.8) ããããããå®çŸ©ãããŠããŸãã
12.16.4 ããŒã«è«çæŒç®å
å®çŸ©æžã¿ã®ããŒã«è«çæŒç®åã¯æ¬¡ã®ãšããã§ãã
bool operator &(bool x, bool y);
bool operator |(bool x, bool y);
bool operator ^(bool x, bool y);
x & y ãš true ã®äž¡æ¹ã x ã§ããã°ãy ã®çµæã¯ true ã§ãã ãã以å€ã®å Žåãçµæã¯ false ã§ãã
x | y ãŸã㯠true ã®ããããã x ã®å Žåã y ã®çµæã¯ true ã«ãªããŸãã ãã以å€ã®å Žåãçµæã¯ false ã§ãã
x ^ y ã true ã§ãã x ã trueã®å ŽåããŸã㯠y ã false ã§ãã x ã falseã®å Žåãy ã®çµæã¯ true ã«ãªããŸãã ãã以å€ã®å Žåãçµæã¯ false ã§ãã ãªãã©ã³ãã boolåã®å Žåã ^ æŒç®å㯠!= æŒç®åãšåãçµæãèšç®ããŸãã
12.16.5 Null 蚱容ããŒã«å€ & |æŒç®å
nullable ããŒã«å bool? ã¯ãtrueãfalseãããã³ nullã® 3 ã€ã®å€ã衚ãããšãã§ããŸãã
ä»ã®äºé
æŒç®åãšåæ§ã«ãè«çæŒç®åã® & ãš | (§12.16.4) ã®ãªããããã圢åŒãäºåã«å®çŸ©ãããŠããŸãã
bool? operator &(bool? x, bool? y);
bool? operator |(bool? x, bool? y);
ãªããããã & æŒç®åãš | æŒç®åã®ã»ãã³ãã£ã¯ã¹ã¯ã次ã®è¡šã§å®çŸ©ããŸãã
x |
y |
x & y |
x \| y |
|---|---|---|---|
true |
true |
true |
true |
true |
false |
false |
true |
true |
null |
null |
true |
false |
true |
false |
true |
false |
false |
false |
false |
false |
null |
false |
null |
null |
true |
null |
true |
null |
false |
false |
null |
null |
null |
null |
null |
泚æ:
bool?åã¯æŠå¿µçã«ã¯ãSQL ã®ããŒã«åŒã«äœ¿çšããã 3 ã€ã®å€ã®åã«äŒŒãŠããŸãã äžã®è¡šã¯ SQL ãšåãã»ãã³ãã£ã¯ã¹ã«åŸããŸããäžæ¹ã §12.4.8 ã®èŠåã&ããã³|æŒç®åã«ã¯é©çšããŸããã §12.4.8 ã®èŠåã§ã¯ããªããããã^æŒç®åã«å¯Ÿã㊠SQL ã«äŒŒãã»ãã³ãã£ã¯ã¹ãæ¢ã«æäŸãããŠããŸãã æ³šé
12.17 æ¡ä»¶ä»ãè«çæŒç®å
12.17.1 å šè¬
&& æŒç®åãš || æŒç®åã¯ãæ¡ä»¶ä»ãè«çæŒç®åãšåŒã°ããŸãã ãããã¯ã"ç絡" è«çæŒç®åãšãåŒã°ããŸãã
conditional_and_expression
: inclusive_or_expression
| conditional_and_expression '&&' inclusive_or_expression
;
conditional_or_expression
: conditional_and_expression
| conditional_or_expression '||' conditional_and_expression
;
&& æŒç®åãš || æŒç®åã¯ã & æŒç®åãš | æŒç®åã®æ¡ä»¶ä»ãããŒãžã§ã³ã§ãã
- æŒç®
x && yã¯ãæŒç®x & yã«å¯Ÿå¿ããŸãããã ããyã¯xãfalseãããŠããªãå Žåã«ã®ã¿è©äŸ¡ãããŸãã - æŒç®
x || yã¯ãæŒç®x | yã«å¯Ÿå¿ããŸãããã ããyã¯xãtrueãããŠããªãå Žåã«ã®ã¿è©äŸ¡ãããŸãã
泚: ã·ã§ãŒããµãŒãããã§ "not true" æ¡ä»¶ãš "not false" æ¡ä»¶ã䜿çšãããçç±ã¯ããŠãŒã¶ãŒå®çŸ©ã®æ¡ä»¶ä»ãæŒç®åã§ã·ã§ãŒããµãŒããããé©çšãããã¿ã€ãã³ã°ãå®çŸ©ã§ããããã«ããããã§ãã ãŠãŒã¶ãŒå®çŸ©åã¯ã
operator trueãfalseãè¿ããoperator falseãfalseãè¿ãç¶æ ã«ãªãå¯èœæ§ããããŸãã ãã®ãããªå Žåã&&ã||ãççž®ããŸããã æ³šé
æ¡ä»¶è«çæŒç®åã®ãªãã©ã³ãã«ã³ã³ãã€ã«æã®å dynamicãããå ŽåãåŒã¯åçã«ãã€ã³ããããŸã (§12.3.3)ã ãã®å ŽåãåŒã®ã³ã³ãã€ã«æã®å㯠dynamic ã§ãããã³ã³ãã€ã«æã®å dynamic ãæã€ãªãã©ã³ãã®å®è¡æã®åã䜿çšããŠãå®è¡æã«ä»¥äžã§èª¬æãã解決ãè¡ãããŸãã
x && y ãŸã㯠x || y 圢åŒã®æŒç®ã¯ã ãŸã㯠x & y ãšèšè¿°ããããã®ããã«ãªãŒããŒããŒã解決ïŒx | yïŒãé©çšããããšã«ãã£ãŠåŠçãããŸãã ãã®ãšããæ¬¡ã®ããã«ãªããŸãã
- ãªãŒããŒããŒãã®è§£æ±ºã§ 1 ã€ã®æé©ãªæŒç®åãèŠã€ãããªãå ŽåããŸãã¯ãªãŒããŒããŒã解決ã§å®çŸ©æžã¿ã®æŽæ°è«çæŒç®åãŸã㯠null 蚱容ããŒã«è«çæŒç®å (§12.16.5) ã®ãããããéžæãããšããã€ã³ãæãšã©ãŒãçºçããŸãã
- ãã以å€ã®å ŽåãéžæããæŒç®åãå®çŸ©æžã¿ã®ããŒã«è«çæŒç®å (§12.16.4) ã® 1 ã€ã§ããå Žåãæäœã¯ §12.17.2 ã§èª¬æãããŠããããã«åŠçãããŸãã
- ãã以å€ã®å ŽåãéžæããæŒç®åã¯ãŠãŒã¶ãŒå®çŸ©æŒç®åã§ããã æäœã¯ §12.17.3 ã§èª¬æãããŠããããã«åŠçãããŸãã
æ¡ä»¶ä»ãè«çæŒç®åãçŽæ¥ãªãŒããŒããŒãããããšã¯ã§ããŸããã ãã ããæ¡ä»¶ä»ãè«çæŒç®åã¯éåžžã®è«çæŒç®åã®èгç¹ããè©äŸ¡ããããããéåžžã®è«çæŒç®åã®ãªãŒããŒããŒãã¯ãç¹å®ã®å¶éããããæ¡ä»¶ä»ãè«çæŒç®åã®ãªãŒããŒããŒããšãèŠãªãããŸãã ããã«ã€ããŠã¯ã §12.17.3 ã§è©³ãã説æããŸãã
12.17.2 ããŒã«æ¡ä»¶è«çæŒç®å
&& ãŸã㯠|| ã®ãªãã©ã³ãã boolåã®å ŽåããŸãã¯ãªãã©ã³ãã該åœãã operator & ãŸã㯠operator |ãå®çŸ©ããªããã boolãžã®æé»çãªå€æãå®çŸ©ããåã®å ŽåãæŒç®ã¯æ¬¡ã®ããã«åŠçãããŸãã
- æŒç®
x && yã¯ãx ? y : falseãšããŠè©äŸ¡ãããŸãã ã€ãŸãããŸãxãè©äŸ¡ãããboolåã«å€æãããŸãã æ¬¡ã«ãããxãtrueã§ããå Žåãyãè©äŸ¡ãããboolåã«å€æããããã®çµæãæŒç®ã®çµæãšãªããŸãã ãã以å€ã®å ŽåãæŒç®ã®çµæã¯falseã§ãã - æŒç®
x || yã¯ãx ? true : yãšããŠè©äŸ¡ãããŸãã ã€ãŸãããŸãxãè©äŸ¡ãããboolåã«å€æãããŸãã æ¬¡ã«ãxãtrueã§ããå ŽåãæŒç®ã®çµæã¯trueã§ãã ãã以å€ã®å Žåãyãè©äŸ¡ãããboolåã«å€æããããã®çµæãæŒç®ã®çµæãšãªããŸãã
12.17.3 ãŠãŒã¶ãŒå®çŸ©ã®æ¡ä»¶ä»ãè«çæŒç®å
&& ãŸã㯠|| ã®ãªãã©ã³ãããé©çšå¯èœãªãŠãŒã¶ãŒå®çŸ©ã® operator & ãŸã㯠operator |ã宣èšããåã§ããå Žåãæ¬¡ã®äž¡æ¹ã true ã«ãªããŸããããã§ã T ã¯ãéžæããæŒç®åã宣èšãããŠããåã§ãã
- éžæããæŒç®åã®æ»ãåãšåãã©ã¡ãŒã¿ãŒã®åã¯
Tã§ãªããã°ãªããŸããã ã€ãŸããæŒç®åã¯ãTåã® 2 ã€ã®ãªãã©ã³ãã®è«ç AND ãŸãã¯è«ç OR ãèšç®ããTåã®çµæãè¿ããŸãã -
Tã«ã¯ãoperator trueãšoperator falseã®å®£èšãå«ãŸããŠããå¿ èŠããããŸãã
ãããã®èŠä»¶ã®ãããããæºããããŠããªãå Žåããã€ã³ãæãšã©ãŒãçºçããŸãã ãã以å€ã®å Žåã && ãŸã㯠|| æŒç®ã¯ããŠãŒã¶ãŒå®çŸ©ã® operator true ãŸã㯠operator false ãéžæãããŠãŒã¶ãŒå®çŸ©æŒç®åãšçµã¿åãããããšã«ãã£ãŠè©äŸ¡ãããŸãã
- æŒç®
x && yã¯T.false(x) ? x : T.&(x, y)ãšããŠè©äŸ¡ãããŸããããã§ãT.false(x)ã¯operator falseã§å®£èšãããTã®åŒã³åºãã§ãããT.&(x, y)ã¯éžæããoperator &ã®åŒã³åºãã§ãã ã€ãŸããxãæåã«è©äŸ¡ãããçµæã«å¯ŸããŠoperator falseãåŒã³åºãããxã確å®ã« false ã§ãããã©ããã倿ããŸãã æ¬¡ã«ãxãééããªã false ã®å ŽåãæŒç®ã®çµæã¯ãxã«å¯ŸããŠä»¥åã«èšç®ãããå€ã«ãªããŸãã ãã以å€ã®å Žåã¯ãyãè©äŸ¡ãããéžæããoperator &ããxã«å¯ŸããŠä»¥åã«èšç®ãããå€ãšãæŒç®ã®çµæãçæããããã«yã®ããã«èšç®ãããå€ã«å¯ŸããŠåŒã³åºãããŸãã - æŒç®
x || yã¯T.true(x) ? x : T.|(x, y)ãšããŠè©äŸ¡ãããŸããããã§ãT.true(x)ã¯operator trueã§å®£èšãããTã®åŒã³åºãã§ãããT.|(x, y)ã¯éžæããoperator |ã®åŒã³åºãã§ãã ã€ãŸããxãæåã«è©äŸ¡ãããçµæã«å¯ŸããŠoperator trueãåŒã³åºãããxã確å®ã« true ã§ãããã©ããã倿ããŸãã æ¬¡ã«ãxãééããªã true ã®å ŽåãæŒç®ã®çµæã¯ãxã«å¯ŸããŠä»¥åã«èšç®ãããå€ã«ãªããŸãã ãã以å€ã®å Žåã¯ãyãè©äŸ¡ãããéžæããoperator |ããxã«å¯ŸããŠä»¥åã«èšç®ãããå€ãšãæŒç®ã®çµæãçæããããã«yã®ããã«èšç®ãããå€ã«å¯ŸããŠåŒã³åºãããŸãã
ãããã®æŒç®ã§ãã x ã«ãã£ãŠæå®ãããåŒã¯ 1 åã ãè©äŸ¡ããã y ã«ãã£ãŠæå®ãããåŒã¯è©äŸ¡ãããã1 åã ãè©äŸ¡ããããŸããã
12.18 null åäœæŒç®å
?? æŒç®åã¯ãnull åäœæŒç®åãšåŒã°ããŸãã
null_coalescing_expression
: conditional_or_expression
| conditional_or_expression '??' null_coalescing_expression
| throw_expression
;
a ?? bã®åœ¢åŒã®nullçµååŒã§ããã a ãénullã§ããã°ãçµæã¯ aãšãªããããã§ãªããã°çµæã¯ bãšãªããŸãã æŒç®ã¯ã b ã a ã§ããå Žåã«ã®ã¿ã null ãè©äŸ¡ããŸãã
null åäœæŒç®åã¯å³é£æ³ã§ããã€ãŸããæŒç®ã¯å³ããå·Šã«ã°ã«ãŒãåãããŸãã
äŸ:
a ?? b ?? c圢åŒã®åŒãa ?? (b ?? c)ãšããŠè©äŸ¡ããŸãã äžè¬çã«ã圢åŒE1 ?? E2 ?? ... ?? ENã®åŒã¯ãnull以å€ã®æåã®ãªãã©ã³ããè¿ããŸãããã¹ãŠã®ãªãã©ã³ããnullã®å Žåã¯nullãè¿ããŸãã çµäºãµã³ãã«
a ?? b åŒã®åã¯ããªãã©ã³ãã§äœ¿çšã§ããæé»çãªå€æã«ãã£ãŠç°ãªããŸãã åªå
é ã«ãa ?? b ã®å㯠AâãAããŸã㯠Bã§ãããã ããA ãåãæã€å Žå㯠a ã a ã®åã§ãããB ãåãæã€å Žå㯠b ã bã®åã§ãããŸããAâ ãnull蚱容å€åã®å ŽåãA 㯠A ã®åºã«ãªãåããã以å€ã®å Žå㯠A ã§ãã å
·äœçã«ã¯ã a ?? b ã¯æ¬¡ã®ããã«åŠçãããŸãã
-
Aãååšããnull é蚱容å€åãŸãã¯å®å šã§ãªãã³ãŒãå ã®ãã€ã³ã¿ãŒåã§ããå Žåã¯ãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã - ãã以å€ã®å Žåã
AãååšããbãåçãªåŒã§ããå Žåãçµæã®åã¯dynamicã§ãã å®è¡æã«ãaãæåã«è©äŸ¡ãããŸããaãnullã§ãªãå Žåãaã¯dynamicã«å€æããããããçµæã«ãªããŸãã ãã以å€ã®å Žåã¯ãbãè©äŸ¡ããããããçµæã«ãªããŸãã - ãã以å€ã®å Žåã
Aãååšããnull 蚱容å€åã§ãããbããAâãžã®æé»çãªå€æãååšããå Žåãçµæã®åã¯Aâã§ãã å®è¡æã«ãaãæåã«è©äŸ¡ãããŸããaãnullã§ãªãå Žåãaã¯Aâåã«å±éããããããçµæã«ãªããŸãã ãã以å€ã®å Žåãbãè©äŸ¡ãããAâåã«å€æããããããçµæã«ãªããŸãã - ãã以å€ã®å Žåã
AãååšããbããAãžã®æé»çãªå€æãååšããå Žåãçµæã®åã¯Aã§ãã å®è¡æã«ãaãæåã«è©äŸ¡ãããŸããaãnullãããŠããªãå Žåãaçµæã«ãªããŸãã ãã以å€ã®å Žåãbãè©äŸ¡ãããAåã«å€æããããããçµæã«ãªããŸãã - ãã以å€ã®å Žåã
Aãååšããnull 蚱容å€åã§ãããbã®åãBã§ãããAâããBãžã®æé»çãªå€æãååšããå Žåãçµæã®åã¯Bã«ãªããŸãã å®è¡æã«ãaãæåã«è©äŸ¡ãããŸããaãnullã§ã¯ãªãå Žåãaã¯Aâåã«ã©ããè§£é€ãããBåã«å€æããããããçµæã«ãªããŸãã ããä»¥å€ ã®å Žåãbãè©äŸ¡ããããããçµæãšãªããŸãã - ãã以å€ã®å Žåã
bã«åBããããaããBãžã®æé»çãªå€æãååšããå Žåãçµæã®åã¯BãšãªããŸãã å®è¡æã«ãaãæåã«è©äŸ¡ãããŸããaãnullã§ãªãå Žåãaã¯Båã«å€æããããããçµæã«ãªããŸãã ããä»¥å€ ã®å Žåãbãè©äŸ¡ããããããçµæãšãªããŸãã - ãã以å€ã®å Žåã
aãšbã«äºææ§ããããŸãããã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
äŸ:
T M<T>(T a, T b) => a ?? b; string s = M(null, "text"); int i = M(19, 23);ã¡ãœãã
Tã®åãã©ã¡ãŒã¿ãŒMã¯å¶çŽãããŠããŸããã ãããã£ãŠãMã®æåã®åŒã³åºãã«ç€ºãããã«ãååŒæ°ã«ã¯åç §åãŸã㯠null 蚱容å€åãæå®ã§ããŸããMã® 2 çªç®ã®åŒã³åºãã«ç€ºãããã«ãååŒæ°ã«ã¯ null é蚱容å€åãæå®ããããšãã§ããŸãã ååŒæ°ã null é蚱容å€åã®å ŽåãåŒa ?? bã®å€ã¯aãçµäºãµã³ãã«
12.19 throw åŒæŒç®å
throw_expression
: 'throw' null_coalescing_expression
;
throw_expression ã¯ãnull_coalescing_expressionãè©äŸ¡ããããšã«ãã£ãŠçæãããå€ãæããŸãã åŒã¯æé»çã« System.Exceptionã«å€æã§ããåŒãè©äŸ¡ããçµæã¯ã¹ããŒãããåã« System.Exception ã«å€æãããŸãã
throw åŒ ã®è©äŸ¡å®è¡æã®åäœã¯ã throw ã¹ããŒãã¡ã³ã (§13.10.6) ã«æå®ãããŠãããã®ãšåãã§ãã
throw_expression ã«åã¯ãããŸããã throw_expression ã¯ãæé»çã¹ããŒå€æã«ãã£ãŠã©ã®åã«ã倿ã§ããŸãã
throw åŒ ã¯ãæ¬¡ã®æ§æäžã®ã³ã³ããã¹ãã§ã®ã¿äœ¿çšãããã¹ãã§ãã
- äžé
æ¡ä»¶æŒç®å (
?:) ã® 2 çªç®ãŸã㯠3 çªç®ã®ãªãã©ã³ããšããŠæå®ããŸãã - null åäœæŒç®å (
??) ã®ç¬¬2ãªãã©ã³ããšããŠäœ¿çšãããŸãã - åŒåœ¢åŒ lambda ãŸãã¯ã¡ã³ããŒã®æ¬æãšããŠã
12.20 宣èšåŒ
宣èšåŒã¯ãããŒã«ã«å€æ°ã宣èšããŸãã
declaration_expression
: 'scoped'? local_variable_type identifier
;
local_variable_type
: type
| 'var'
;
'scoped' ã¯ãlocal_variable_typeã 'var' ãŸã㯠ref æ§é äœåã§ãããidentifer ãç Žæ£ã§ã¯ãªãå Žåã«ã®ã¿ãlocal_variable_typeã§èš±å¯ãããŸãã
simple_name_ ã¯ãåçŽãªååæ€çŽ¢ã§é¢é£ãã宣èšãèŠã€ãããªãã£ãå Žåã«ã宣èšåŒãšèŠãªãããŸã (§12.8.4)ã 宣èšåŒãšããŠäœ¿çšããå Žåã_ 㯠åçŽãªç Žæ£ãšåŒã°ããŸãã æå³çã«ã¯ var _ã«çžåœããŸãããããå€ãã®å Žæã§èš±å¯ãããŸãã
宣èšåŒã¯ãæ¬¡ã®æ§æã³ã³ããã¹ãã§ã®ã¿çºçããŸãã
-
outã® argument_valueã - åçŽãªç Žæ£
_ãšããŠãåçŽãªå²ãåœãŠã®å·ŠåŽ (§12.24.2) ã§æ§æãããŸãã - deconstructor_element (§12.24.3)ããŸãã¯abridged_deconstructor_element (§12.24.3) ã®ç瞮圢ã
泚æ: 宣èšåŒããã£ãã§åããããšã¯ã§ããŸããã æ³šé
宣èšãè¡ããã argument_list å ã§åç §ããã declaration_expression ã§å®£èšãããæé»çã«æå®ããã倿°ã«å¯Ÿãããšã©ãŒã§ãã
declaration_expression ã§å®£èšããã倿°ãããããçºçããåè§£ä»£å ¥å ã§åç §ãããããšã¯ãšã©ãŒã§ãã
åçŽãªç Žæ£ããŸã㯠local_variable_type ã var èå¥åã§ãã宣èšåŒã¯ã æé»çã«åæå®ããã 倿°ãšããŠåé¡ãããŸãã åŒã«ã¯åããªããããŒã«ã«å€æ°ã®åã¯æ¬¡ã®ããã«æ§æã³ã³ããã¹ãã«åºã¥ããŠæšè«ãããŸãã
- argument_list ã§ã¯ã倿°ã®æšè«ãããåã¯ã察å¿ãããã©ã¡ãŒã¿ãŒã®å®£èšãããåã§ãã
- åçŽãªä»£å ¥ã®å·ŠåŽãšããŠã倿°ã®æšè«ãããåã¯ä»£å ¥ã®å³åŽã®åã§ãã
- åè§£å (§12.24.3) ã§ã¯ã倿°ã®æšè«ãããåã¯ãä»£å ¥ã®å³åŽ (åè§£åŸ) ã®å¯Ÿå¿ããã¿ãã«èŠçŽ ã®åã§ãã
ãã以å€ã®å Žåã宣èšåŒã¯ æç€ºçã«åæå®ããã 倿° ãšããŠåé¡ãããåŒã®åãšå®£èšããã倿°ã¯ã local_variable_typeã«ãã£ãŠæå®ããããã®ãšããŸãã
èå¥å _ ãæã€å®£èšåŒã¯ç Žæ£ (§9.2.9.2) ã§ããã倿°ã®ååã¯å°å
¥ãããŸããã
_以å€ã®èå¥åãæã€å®£èšåŒã§ã¯ããã®ååãæãè¿ãå€åŽã®ããŒã«ã«å€æ°å®£èšç©ºé (§7.2) ã«å°å
¥ãããŸãã
äŸ:
string M(out int i, string s, out bool b) { ... } var s1 = M(out int i1, "One", out var b1); Console.WriteLine($"{i1}, {b1}, {s1}"); // Error: i2 referenced within declaring argument list var s2 = M(out var i2, M(out i2, "Two", out bool b2), out b2); var s3 = M(out int _, "Three", out var _);
s1ã®å®£èšã§ã¯ãæç€ºçã«åæå®ããã宣èšåŒãšæé»çã«åæå®ããã宣èšåŒã®äž¡æ¹ã衚瀺ãããŸããb1ã®æšè«ãããåã¯ãboolã®å¯Ÿå¿ããåºåãã©ã¡ãŒã¿ãŒã®åã§ãããããM1ã§ãã åŸç¶ã®WriteLineã¯ãi1ããã³b1ã«ã¢ã¯ã»ã¹ã§ããå²ãããç¯å²ã«å°å ¥ãããŸãã
s2ã®å®£èšã§ã¯ãi2ãžã®å ¥ãåã«ãªã£ãåŒã³åºãã§Mã䜿çšããããšããŸããããããã¯èš±å¯ãããŠããŸãããããã¯ãi2ã宣èšãããåŒæ°ãªã¹ãå ã§åç §ãè¡ãããããã§ãã äžæ¹ãæåŸã®åŒæ°ã®b2ãžã®åç §ã¯èš±å¯ãããŸããããã¯ãb2ã宣èšãããå ¥ãåã«ãªã£ãåŒæ°ãªã¹ãã®æ«å°Ÿã®åŸã«çºçããããã§ãã
s3ã®å®£èšã¯ãæç€ºçããã³æé»çã«æå®ãããç Žæ£ããã宣èšåŒã®äœ¿çšã瀺ããŠããŸãã ç Žæ£ã§ã¯ååä»ã倿°ã宣èšãããªããããèå¥å_ã®è€æ°åã®åºçŸãèš±å¯ãããŸãã(int i1, int _, (var i2, var _), _) = (1, 2, (3, 4), 5);ãã®äŸã§ã¯ã倿°ãšç Žæ£ã®äž¡æ¹ã«å¯ŸããŠæé»çããã³æç€ºçã«åæå®ããã宣èšåŒãåè§£ä»£å ¥ã§äœ¿çšããæ¹æ³ã瀺ããŸãã simple_name
_ã¯ãvar _ã®å®£èšãèŠã€ãããªãå Žåã®_ã«çžåœããŸããvoid M1(out int i) { ... } void M2(string _) { M1(out _); // Error: `_` is a string M1(out var _); }ãã®äŸã§ã¯ãå²ãããç¯å²ã§å€æ°ãæå®ãããããã
var _ãååšããªãå Žåã«æé»çã«æå®ãããç Žæ£ãè¡ãããã«_ã䜿çšããæ¹æ³ã瀺ããŠããŸããçµäºãµã³ãã«
12.21 æ¡ä»¶æŒç®å
?: 㯠"null æ¡ä»¶æŒç®å" ãšåŒã°ããæŒç®åã§ãã æã«ã¯äžé
æŒç®åãšãåŒã°ããŸãã
conditional_expression
: null_coalescing_expression
| null_coalescing_expression '?' expression ':' expression
| null_coalescing_expression '?' 'ref' variable_reference ':'
'ref' variable_reference
;
æ¡ä»¶æŒç®åãååšããå Žåãã¹ããŒåŒ (§12.19) ã¯èš±å¯ãããŸãã ref ã
æåã«ããã©ãŒã ã®æ¡ä»¶åŒ b ? x : y ãæ¡ä»¶ bãè©äŸ¡ããŸãã æ¬¡ã«ã b ã true ã®å Žåã x ãè©äŸ¡ãããæŒç®ã®çµæã«ãªããŸãã ãã以å€ã®å Žåã y ãè©äŸ¡ãããæŒç®ã®çµæã«ãªããŸãã æ¡ä»¶åŒã¯ãx ãš yã®äž¡æ¹ãè©äŸ¡ããŸããã
æ¡ä»¶æŒç®åã¯å³é£æ³ã§ããã€ãŸããæŒç®ã¯å³ããå·Šã«ã°ã«ãŒãåãããŸãã
äŸ:
a ? b : c ? d : e圢åŒã®åŒãa ? b : (c ? d : e)ãšããŠè©äŸ¡ããŸãã çµäºãµã³ãã«
?: æŒç®åã®æåã®ãªãã©ã³ãã¯ãæé»çã« boolã«å€æã§ããåŒããŸã㯠operator trueãå®è£
ããåã®åŒã§ããå¿
èŠããããŸãã ã©ã¡ãã®èŠä»¶ãæºããããŠããªãå Žåã¯ãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
ref ãããå Žåã
- 2 ã€ã® variable_referenceã®åã®éã«ã¯ ID 倿ãååšããçµæã®åã¯ã©ã¡ãã®åã§ãããŸããŸããã ããããã®åã
dynamicã®å Žåãåæšè«ã¯dynamic(§8.7) ãåªå ããŸãã ããããã®åãã¿ãã«å (§8.3.11) ã®å Žåãåãåºæ°äœçœ®ã®èŠçŽ åãäž¡æ¹ã®ã¿ãã«ã§äžèŽããå Žåãåæšè«ã«ã¯èŠçŽ åãå«ãŸããŸãã - çµæã¯å€æ°åç §ã§ãããäž¡æ¹ã® variable_referenceãæžã蟌ã¿å¯èœãªå Žåã¯æžã蟌ã¿å¯èœã§ãã
泚æ:
refãååšããå Žåã conditional_expression ã¯å€æ°åç §ãè¿ããŸããããã¯ã= refæŒç®åã䜿çšããŠåç §å€æ°ã«å²ãåœãŠãããšãã§ããããåç §/å ¥å/åºåãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããšãã§ããŸãã æ³šé
ref ãååšããªãå Žåã x æŒç®åã® 2 çªç®ãš 3 çªç®ã®ãªãã©ã³ã (y ããã³ ?:) ã¯ãæ¡ä»¶åŒã®åãå¶åŸ¡ããŸãã
-
xã«åXããããyã«åYãããå Žåã¯ã-
XãšYã®éã« ID 倿ãååšããå Žåãçµæã¯äžé£ã®åŒã®æãäžè¬çãªåã«ãªããŸã (§12.6.3.17)ã "12.6.4.5 åŒããã®å€æã®åäž" ãäœããã®åœ¢ã§åç §ããåèªã®ãã¬ãŒã¹ãã«ã㌠ãããããã®åãdynamicã®å Žåãåæšè«ã¯dynamic(§8.7) ãåªå ããŸãã ããããã®åãã¿ãã«å (§8.3.11) ã®å Žåãåãåºæ°äœçœ®ã®èŠçŽ åãäž¡æ¹ã®ã¿ãã«ã§äžèŽããå Žåãåæšè«ã«ã¯èŠçŽ åãå«ãŸããŸãã - ãã以å€ã®å Žåãæé»çãªå€æ (§10.2) ã
XããYã«ååšããããYããXã«ã¯ååšããªãå ŽåãYã¯æ¡ä»¶åŒã®åã«ãªããŸãã - ãã以å€ã®å Žåãæé»çãªåæå€æ (§10.2.4) ã
XããYã«ååšããå ŽåãYã¯æ¡ä»¶åŒã®åã«ãªããŸãã - ãã以å€ã®å Žåãæé»çãªåæå€æ (§10.2.4) ã
YããXã«ååšããå ŽåãXã¯æ¡ä»¶åŒã®åã«ãªããŸãã - ãã以å€ã®å Žåãæé»çãªå€æ (§10.2) ã
YããXã«ååšããããXããYã«ã¯ååšããªãå ŽåãXã¯æ¡ä»¶åŒã®åã«ãªããŸãã - ãã以å€ã®å Žåã¯ãåŒã®åãç¹å®ã§ããªããªããã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
-
-
xãšyã® 1 ã€ã ãã«åããããxãšyã®äž¡æ¹ããã®åã«æé»çã«å€æã§ããå Žåããããæ¡ä»¶åŒã®åã«ãªããŸãã - ãã以å€ã®å Žåã¯ãåŒã®åãç¹å®ã§ããªããªããã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
ãã©ãŒã b ? ref x : ref y ã® ref æ¡ä»¶åŒã®å®è¡æåŠçã¯ãæ¬¡ã®æé ã§æ§æãããŸãã
- ãŸãã
bãè©äŸ¡ãããboolã®bå€ã決å®ãããŸãã-
bã®åããboolãžã®æé»çãªå€æãååšããå Žåã¯ããã®æé»çãªå€æãå®è¡ãããboolå€ãçæãããŸãã - ãã以å€ã®å Žåã¯ã
operator trueã®åã«ãã£ãŠå®çŸ©ãããbãåŒã³åºãããboolå€ãçæãããŸãã
-
- äžèšã®æé ã§çæããã
boolå€ãtrueå Žåãxãè©äŸ¡ãããçµæã®å€æ°åç §ãæ¡ä»¶åŒã®çµæã«ãªããŸãã - ãã以å€ã®å Žåã
yãè©äŸ¡ãããçµæã®å€æ°åç §ãæ¡ä»¶åŒã®çµæã«ãªããŸãã
ãã©ãŒã b ? x : y ã®æ¡ä»¶åŒã®å®è¡æåŠçã¯ãæ¬¡ã®æé ã§æ§æãããŸãã
- ãŸãã
bãè©äŸ¡ãããboolã®bå€ã決å®ãããŸãã-
bã®åããboolãžã®æé»çãªå€æãååšããå Žåã¯ããã®æé»çãªå€æãå®è¡ãããboolå€ãçæãããŸãã - ãã以å€ã®å Žåã¯ã
operator trueã®åã«ãã£ãŠå®çŸ©ãããbãåŒã³åºãããboolå€ãçæãããŸãã
-
- äžèšã®æé ã§çæããã
boolå€ãtrueã§ããå Žåãxãè©äŸ¡ãããæ¡ä»¶åŒã®åã«å€æããããããæ¡ä»¶åŒã®çµæã«ãªããŸãã - ãã以å€ã®å Žåã
yã¯è©äŸ¡ãããæ¡ä»¶åŒã®åã«å€æããããããæ¡ä»¶åŒã®çµæã«ãªããŸãã
12.22 å¿å颿°åŒ
12.22.1 å šè¬
å¿å颿° ã¯ã"ã€ã³ã©ã€ã³" ã¡ãœããå®çŸ©ã衚ãåŒã§ãã å¿å颿°èªäœã«ã¯å€ãåã¯ãããŸããããäºææ§ã®ããããªã²ãŒãåãŸãã¯åŒããªãŒåã«å€æã§ããŸãã å¿å颿°å€æã®è©äŸ¡ã¯ã倿ã®ã¿ãŒã²ããåã«ãã£ãŠç°ãªããŸããããªã²ãŒãåã®å Žåãå¿å颿°ãå®çŸ©ããã¡ãœãããåç §ããããªã²ãŒãå€ã«å€æãè©äŸ¡ãããŸãã åŒããªãŒåã®å Žåã倿ã¯ã¡ãœããã®æ§é ããªããžã§ã¯ãæ§é ãšããŠè¡šãåŒããªãŒã«è©äŸ¡ãããŸãã
泚: æŽå²çãªçç±ãããå¿å颿°ã«ã¯ã lambda_expression ãš anonymous_method_expressionãšãã 2 çš®é¡ã®æ§æããããŸãã ã»ãŒãã¹ãŠã®ç®çã§ã lambda_expression 㯠anonymous_method_expressionãããç°¡æœã§è¡šçŸåãé«ããäžäœäºææ§ã®ããã«èšèªã«æ®ã£ãŠããŸãã æ³šé
lambda_expression
: attributes? anonymous_function_modifier?
(return_type | ref_kind ref_return_type)?
anonymous_function_signature '=>' anonymous_function_body
;
anonymous_method_expression
: anonymous_function_modifier? 'delegate' explicit_anonymous_function_signature? block
;
anonymous_function_modifier
: 'async' 'static'?
| 'static' 'async'?
;
anonymous_function_signature
: explicit_anonymous_function_signature
| implicit_anonymous_function_signature
;
explicit_anonymous_function_signature
: '(' parameter_list? ')'
;
implicit_anonymous_function_signature
: '(' implicit_anonymous_function_parameter_list? ')'
| implicit_anonymous_function_parameter
;
implicit_anonymous_function_parameter_list
: implicit_anonymous_function_parameter
(',' implicit_anonymous_function_parameter)*
;
implicit_anonymous_function_parameter
: attributes? identifier
;
anonymous_function_body
: null_conditional_invocation_expression
| expression
| 'ref' variable_reference
| block
;
修食å static ãååšããå Žåãå¿å颿°ã¯å€åŽã®ã¹ã³ãŒãããç¶æ
ããã£ããã£ã§ããŸããã
staticå¿å颿°ã¯ãå€åŽã®ã¹ã³ãŒãstaticã¡ã³ããŒãåãã©ã¡ãŒã¿ãŒãããã³å®æ°å®çŸ©ãåç
§ã§ããŸãã
scopedã®èª¬æã«ã€ããŠã¯ã§9.7.3 ãåç
§ããŠãã ããã
static以å€ã®ããŒã«ã«é¢æ°ãŸãã¯éstaticå¿å颿°ã¯ãå€åŽã®staticå¿å颿°ããç¶æ
ããã£ããã£ã§ããŸãããå€åŽã®staticå¿å颿°ã®å€éšã§ç¶æ
ããã£ããã£ããããšã¯ã§ããŸããã
泚: æå¹ãªããã°ã©ã ã®å¿å颿°ãã
static修食åãåé€ããŠããããªã²ãŒã ã€ã³ã¹ã¿ã³ã¹ ID ã«åœ±é¿ããå¯èœæ§ããã (§10.7.2) 以å€ã«ãããã°ã©ã ã®æå³ã¯å€ãããŸããã æ³šé
泚:
staticå¿å颿°ã¯ãåè©äŸ¡ã§åãããªã²ãŒã ã€ã³ã¹ã¿ã³ã¹ãçæããå¿ èŠã¯ãããŸããã §10.7.2 ãåç §ããŠãã ããã æ³šé
lambda_expressionã«ã¯ãthis修食åãæã€parameter_modifierã¯å«ãŸããŸããã
anonymous_method_expressionã«ã¯ãdefault_argumentãŸãã¯parameter_collectionãå«ããŠã¯ãªããªãã
anonymous_function_body ãèªèããéã«ãnull_conditional_invocation_expression åŒãš è¡šçŸ ã®ä»£æ¿ææ®µã®äž¡æ¹ãé©çšå¯èœãªå Žåã¯ãåè ãéžæããªããã°ãªããŸããã
泚:ããã§ã®ä»£æ¿ææ®µã®éè€ãšåªå é äœã¯ã説æçãªå©äŸ¿æ§ã®ã¿ãç®çãšããŠããŸããææ³èŠåã詳ãã説æããŠãéè€ãåãé€ãå¯èœæ§ããããŸãã ANTLR ããã®ä»ã®ææ³ã·ã¹ãã ã§ã¯ãåãå©äŸ¿æ§ãæ¡çšãããŠããããã anonymous_function_body ã«ã¯æå®ãããã»ãã³ãã£ã¯ã¹ãèªåçã«é©çšãããŸãã æ³šé
泚: åŒãšããŠæ±ãå Žåã
x?.M()ã®çµæã®åãMå Žåãvoidãªã©ã®æ§æåœ¢åŒã¯ãšã©ãŒã«ãªããŸã (§12.8.8)ã ãããã null_conditional_invocation_expressionãšããŠæ±ãããå Žåãçµæã®åã¯voidããããšãèš±å¯ãããŸãã æ³šé
äŸ:
List<T>.Reverseã®çµæåã¯voidã æ¬¡ã®ã³ãŒãã§ã¯ãå¿ååŒã®æ¬æã¯ null_conditional_invocation_expressionã§ããããããšã©ãŒã§ã¯ãããŸãããAction<List<int>> a = x => x?.Reverse();çµäºãµã³ãã«
=> æŒç®åã¯ä»£å
¥ (=) ãšåãåªå
é äœãæã¡ãå³çµåã§ãã
泚: §23.5.3.2 ãããlambda_expressionå ã®å±æ§ããã®åŒãæ¡ä»¶ä»ãã¡ãœãããšããŠæå®ã§ããªãããšãæšæž¬ã§ããŸãã æ³šé
async修食åãæã€å¿å颿°ã¯éåæé¢æ°ã§ããã§15.14 ã§èª¬æãããŠããèŠåã«åŸããŸãã
lambda_expression ã®åœ¢åŒã®å¿å颿°ã®ãã©ã¡ãŒã¿ãŒã¯ãæç€ºçãŸãã¯æé»çã«åæå®ã§ããŸãã æç€ºçã«åæå®ããããã©ã¡ãŒã¿ãŒ ãªã¹ãã§ã¯ãåãã©ã¡ãŒã¿ãŒã®åãæç€ºçã«æå®ãããŸãã æé»çã«åæå®ããããã©ã¡ãŒã¿ãŒ ãªã¹ãã§ã¯ãå¿å颿°ãçºçããã³ã³ããã¹ããããã©ã¡ãŒã¿ãŒã®åãæšè«ãããŸããå ·äœçã«ã¯ãå¿å颿°ãäºææ§ã®ããããªã²ãŒãåãŸãã¯åŒããªãŒåã«å€æããããšããã®åã¯ãã©ã¡ãŒã¿ãŒå (§10.7) ãæäŸããŸãã
æé»çã«åæå®ãããåäžã®ãã©ã¡ãŒã¿ãŒãæã€lambda_expressionã§ã¯ãlambda_expressionã«åŒå šäœãŸãã¯ãã®explicit_anonymous_function_parameterã«å±æ§ããªããæç€ºçãªæ»ãå€ã®åããªãå Žåã¯ããã©ã¡ãŒã¿ãŒ ãªã¹ããããã£ããçç¥ã§ããŸãã ã€ãŸãããã©ãŒã ã®å¿å颿°ã§ãã
( «param» ) => «expr»
ã¯ã次ã®çç¥ã§ããŸãã
«param» => «expr»
anonymous_method_expression ã®åœ¢åŒã®å¿å颿°ã®ãã©ã¡ãŒã¿ãŒ ãªã¹ãã¯çç¥å¯èœã§ãã æå®ãããå Žåããã©ã¡ãŒã¿ã¯ãæç€ºçã«æå®ãããŸãã ããã§ãªãå Žåãå¿å颿°ã¯ãåºåãã©ã¡ãŒã¿ãŒãå«ãŸãªããã©ã¡ãŒã¿ãŒ ãªã¹ããæã€ããªã²ãŒãã«å€æã§ããŸãã
å¿å颿°ã® explicit_anonymous_function_parameter ã anonymous_method_expression ã®åœ¢åŒã§å±æ§ãæã€å Žåã¯ãã³ã³ãã€ã« ãšã©ãŒ ã§ãã
å¿å颿°ã® ããã㯠æ¬äœã«åžžã«å°éå¯èœã§ã (§13.2)ã
äŸ: å¿å颿°ã®äŸãããã€ã次ã«ç€ºããŸãã
x => x + 1 // Implicitly typed, expression body x => { return x + 1; } // Implicitly typed, block body (int x) => x + 1 // Explicitly typed, expression body (int x) => { return x + 1; } // Explicitly typed, block body static (int x) => x + 1 // static anonymous function, explicitly typed, expression body static (int x) => { return x + 1; } // static anonymous function, explicitly typed, block body (x, y) => x * y // Multiple parameters () => Console.WriteLine() // No parameters async (t1,t2) => await t1 + await t2 // Async delegate (int x) { return x + 1; } // Anonymous method expression static delegate (int x) { return x + 1; } // static anonymous method expression delegate { return 1 + 1; } // Parameter list omitted var addWithDefault = (int addTo = 2) => addTo + 1; var counter = (params int[] xs) => xs.Length; var concat = string ([DisallowNull] string a, [DisallowNull] string b) => a + b; Func<string, int?> parse = [X][return: Y] ([Z] s) => (s is not null) ? int.Parse(s) : null; var lambda = (in int p1, out bool p2, scoped ref float p3, scoped Span<int> p4) => Mlam(in p1, out p2, ref p3, p4);çµäºãµã³ãã«
lambda_expressionãš anonymous_method_expressionã®åäœã¯ã次ã®ç¹ãé€ããŠåãã§ãã
- anonymous_method_expressionã§ã¯ããã©ã¡ãŒã¿ãŒ ãªã¹ããå®å šã«çç¥ã§ãããããå€ãã©ã¡ãŒã¿ãŒã®ä»»æã®ãªã¹ãã®ããªã²ãŒãåãžã®å€æãå¯èœã«ãªããŸãã
- lambda_expressionã¯ãã©ã¡ãŒã¿ãŒåã®çç¥ãšæšè«ãèš±å¯ããŸããã anonymous_method_expressionã§ã¯ãã©ã¡ãŒã¿ãŒåãæç€ºçã«æå®ããå¿ èŠããããŸãã
- lambda_expression ã®æ¬äœã¯åŒãŸãã¯ãããã¯ã«ããããšãã§ããŸããã anonymous_method_expression ã®æ¬äœã¯ãããã¯ã«ãªããŸãã
- äºææ§ã®ããåŒããªãŒåïŒÂ§8.6ïŒã«å€æã§ããã®ã¯ãlambda_expressionã ãã§ãã
- lambda_expression ãã©ã¡ãŒã¿ãŒã«ã®ã¿ 'scoped' ãå«ããããšããããŸãã
- 屿§ãšæç€ºçãªæ»ãå€ã®åãæã€ããšã¯ãlambda_expressionã ãã§ãã
- anonymous_method_expressionã«ã¯ãdefault_argumentãŸãã¯parameter_collectionãå«ãŸããŠããªãå ŽåããããŸãã
ã³ã³ããã¹ã ããŒã¯ãŒã var ã¯ã lambda_expressionã§æç€ºçãªæ»ãå€ã®åãšããŠäœ¿çšããããšã¯ã§ããŸããã
12.22.2 å¿å颿°ã·ã°ããã£
explicit_anonymous_function_parameter_listãŸãã¯implicit_anonymous_function_parameter_listã«è€æ°ã®èå¥åã_å«ãŸããŠããå Žåããããã®åèå¥åã¯ç Žæ£ã衚ããŸã (§9.2.9.2)ã ãã以å€ã®å Žåãåäž ã®èå¥å_ ã¯ãã©ã¡ãŒã¿ãŒã衚ããŸãã
å¿å颿°ã® anonymous_function_signature ã¯ãååãšãå¿
èŠã«å¿ããŠå¿å颿°ã®ãã©ã¡ãŒã¿ãŒã®åãš å±æ§ ãå®çŸ©ããŸãã å¿å颿°ã®éç Žæ£ãã©ã¡ãŒã¿ãŒã®ã¹ã³ãŒãã¯ãå¿å颿°ãŸãã¯ãã®ãã©ã¡ãŒã¿ãŒã«é
眮ããã屿§ã® anonymous_function_body (§7.6) ããã³ nameof åŒã§ãã ãã©ã¡ãŒã¿ãŒ ãªã¹ã (æå®ãããŠããå Žå) ãšå
±ã«ãanonymous-method-body ã¯å®£èšç©ºé (§7.2) ãæ§æããŸãã ãããã£ãŠãå¿å颿°ã®ãã©ã¡ãŒã¿ãŒã®ååãã anonymous_method_expression ãŸã㯠lambda_expressionãå«ãã¹ã³ãŒããæã€ããŒã«ã«å€æ°ãããŒã«ã«å®æ°ããŸãã¯ãã©ã¡ãŒã¿ãŒã®ååãšäžèŽããã³ã³ãã€ã«æãšã©ãŒã«ãªããŸãã
泚: ç Žæ£ãã©ã¡ãŒã¿ãŒã¯ãã©ã®ã¹ã³ãŒãã«ãååãå°å ¥ããªããããä»ã®ãã©ã¡ãŒã¿ãŒãããŒã«ã«å€æ°ãããŒã«ã«å®æ°ããŸãã¯ãã®ä»ã®ç Žæ£ãšç«¶åããŸããã æ³šé
äŸ: 次ã®ã³ãŒãã§ã¯ã
_ããŒã«ã«å€æ°ãã©ã ãæ¬äœå ã®ã¹ã³ãŒãå ã«ãããŸãã ã©ã ãã«ã¯è€æ°ã®_ãã©ã¡ãŒã¿ãŒããããããã©ã¡ããç Žæ£ãããååã¯ä»ããããŸããã ãããã£ãŠãæ¬äœå ã®_ãžã®åç §ã¯ãã©ã ã ãã©ã¡ãŒã¿ãŒã§ã¯ãªããå€åŽã®ããŒã«ã«å€æ°ã«è§£æ±ºãããŸããint _ = 42; Func<int, int, int> f = (_, _) => _; int result = f(1, 2); Console.WriteLine(result); // => 42åºåã¯æ¬¡ã®ãšããã§ãã
42çµäºãµã³ãã«
å¿å颿°ã« explicit_anonymous_function_signatureãããå Žåãäºææ§ã®ããããªã²ãŒãåãšåŒããªãŒåã®ã»ããã¯ãåãé åºã§åããã©ã¡ãŒã¿ãŒåãšä¿®é£Ÿåãæã€ãã®ã«å¶éãããŸã (§10.7)ã ã¡ãœãã ã°ã«ãŒã倿 (§10.8) ãšã¯ç°ãªããå¿å颿°ãã©ã¡ãŒã¿ãŒåã®å忣ã¯ãµããŒããããŠããŸããã å¿å颿°ã« anonymous_function_signatureããªãå Žåãäºææ§ã®ããããªã²ãŒãåãšåŒããªãŒåã®ã»ããã¯ãåºåãã©ã¡ãŒã¿ãŒã®ãªãåã«å¶éãããŸãã
äºææ§ãããå Žåã§ããåŒããªãŒåãžã®å€æã¯ã³ã³ãã€ã«æã«å€±æããå¯èœæ§ãããããšã«æ³šæããŠãã ãã (§8.6)ã
12.22.3 å¿å颿°æ¬äœ
å¿å颿°ã®æ¬äœ (åŒ ãŸã㯠ãããã¯) ã¯ã次ã®èŠåã«åŸããŸãã
- å¿å颿°ã«ã·ã°ããã£ãå«ãŸããŠããå Žåã¯ã眲åã§æå®ãããéç Žæ£ãã©ã¡ãŒã¿ãŒãæ¬æã§äœ¿çšã§ããŸãã å¿å颿°ã«ã·ã°ããã£ããªãå Žåã¯ããã©ã¡ãŒã¿ãŒ (§10.7) ãæã€ããªã²ãŒãåãŸãã¯åŒåã«å€æã§ããŸãããæ¬æã§ãã©ã¡ãŒã¿ãŒã«ã¢ã¯ã»ã¹ããããšã¯ã§ããŸããã
- æãè¿ãã®å²ãå¿å颿°ã®ã·ã°ããã£ã§æå®ãããåç §æž¡ããã©ã¡ãŒã¿ãŒïŒååšããå ŽåïŒãé€ããæ¬æãåç §æž¡ããã©ã¡ãŒã¿ãŒã«ã¢ã¯ã»ã¹ããããšã¯ã³ã³ãã€ã«æãšã©ãŒãšãªããŸãã
- æãè¿ãå
å²ããå¿å颿°ã®ã·ã°ãã㣠(ååšããå Žå) ã§æå®ããããã©ã¡ãŒã¿ãŒãé€ãã颿°ã®æ¬æã
ref structåã®ãã©ã¡ãŒã¿ãŒã«ã¢ã¯ã»ã¹ããããšã¯ãã³ã³ãã€ã«æã®ãšã©ãŒã§ãã - 修食å
staticãååšããå ŽåãthisåŒã®ãªãã©ã³ããé€ããæ¬äœãbaseãnameofããŸãã¯å€éšå€æ°ãåç §ããã®ã¯ã³ã³ãã€ã«æãšã©ãŒã§ãã - 修食å
staticãååšããªãå Žåãthisã®åãæ§é äœåã®å Žåã¯ãæ¬æãthisã«ã¢ã¯ã»ã¹ããããã®ã³ã³ãã€ã«æãšã©ãŒã§ãã ããã¯ãã¢ã¯ã»ã¹ãæç€ºç (this.xãšåæ§) ãæé»çã (xãæ§é äœã®ã€ã³ã¹ã¿ã³ã¹ ã¡ã³ããŒã§ããxã®å Žåãšåæ§) ã«åœãŠã¯ãŸããŸãã ãã®èŠåã§ã¯ããã®ãããªã¢ã¯ã»ã¹ã®ã¿ãçŠæ¢ãããã¡ã³ããŒåç §ã«ãã£ãŠæ§é äœã®ã¡ã³ããŒãäœæããããã©ããã«ã¯åœ±é¿ããŸããã - 修食å
staticãååšããªãå Žåãæ¬äœã¯å¿å颿°ã®å€éšå€æ° (§12.22.6) ã«ã¢ã¯ã»ã¹ã§ããŸãã å€éšå€æ°ãžã®ã¢ã¯ã»ã¹ã¯ã lambda_expression ãŸã㯠anonymous_method_expression ãè©äŸ¡ãããæç¹ã§ã¢ã¯ãã£ããªå€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãåç §ããŸã (§12.22.7)ã - æ¬æã«
gotoã¹ããŒãã¡ã³ããbreakã¹ããŒãã¡ã³ãããŸãã¯ã¿ãŒã²ãããæ¬äœå€ã«ããããå«ãŸããŠããå¿å颿°ã®æ¬äœå ã«ããcontinueã¹ããŒãã¡ã³ããå«ãŸããŠããã®ã¯ãã³ã³ãã€ã«æãšã©ãŒã§ãã - æ¬æã®
returnã¹ããŒãã¡ã³ãã¯ãå²ããã颿°ã¡ã³ããŒããã§ã¯ãªããæãè¿ãã§å²ãããå¿å颿°ã®åŒã³åºãããå¶åŸ¡ãè¿ããŸãã
泚: å¿å颿°ã®
static修食åã¯ãã¢ã¯ã»ã·ããªãã£èŠåã倿ŽããŸããã å€åŽã®ã¹ã³ãŒãã®ãã©ã€ããŒã ã¡ã³ããŒã¯åŒãç¶ãã¢ã¯ã»ã¹ã§ããŸãã æ³šé
lambda_expression ãŸã㯠anonymous_method_expressionã®è©äŸ¡ãšåŒã³åºã以å€ã«å¿å颿°ã®ãããã¯ãå®è¡ããæ¹æ³ããããã©ããã¯æç€ºçã«æå®ãããŠããŸããã ç¹ã«ãã³ã³ãã€ã©ã¯ã1 ã€ä»¥äžã®ååä»ãã¡ãœãããŸãã¯åãåæããŠå¿å颿°ãå®è£ ããããšãéžæã§ããŸãã ãã®ãããªåæãããèŠçŽ ã®ååã¯ãã³ã³ãã€ã©çšã«äºçŽãããåœ¢åŒ (§6.4.3) ã§ããå¿ èŠããããŸãã
12.22.4 ãªãŒããŒããŒãã®è§£æ±º
åŒæ°ãªã¹ãå ã®å¿å颿°ã¯ãåã®æšè«ãšãªãŒããŒããŒãã®è§£æ±ºã«é¢äžããŸãã æ£ç¢ºãªèŠåã«ã€ããŠã¯ã §12.6.3 ãã㳠§12.6.4 ãåç §ããŠãã ããã
äŸ: 次ã®äŸã¯ããªãŒããŒããŒãã®è§£æ±ºã«å¯Ÿããå¿å颿°ã®å¹æã瀺ããŠããŸãã
class ItemList<T> : List<T> { public int Sum(Func<T, int> selector) { int sum = 0; foreach (T item in this) { sum += selector(item); } return sum; } public double Sum(Func<T, double> selector) { double sum = 0; foreach (T item in this) { sum += selector(item); } return sum; } }
ItemList<T>ã¯ã©ã¹ã«ã¯ã2 ã€ã®Sumã¡ãœããããããŸãã ãããããselectoråŒæ°ãåãåãããªã¹ã ã¢ã€ãã ããåèšããå€ãæœåºããŸãã æœåºãããå€ã¯ãintãŸãã¯doubleã®ããããã§ãããçµæã®åèšãåæ§ã«ãintãŸãã¯doubleã®ããããã«ãªããŸããããšãã°ã
Sumã¡ãœããã䜿çšããŠã詳现è¡ã®äžèЧããæ³šæã®åèšãèšç®ã§ããŸããclass Detail { public int UnitCount; public double UnitPrice; ... } class A { void ComputeSums() { ItemList<Detail> orderDetails = GetOrderDetails( ... ); int totalUnits = orderDetails.Sum(d => d.UnitCount); double orderTotal = orderDetails.Sum(d => d.UnitPrice * d.UnitCount); ... } ItemList<Detail> GetOrderDetails( ... ) { ... } }
orderDetails.Sumã®æåã®åŒã³åºãã§ã¯ãå¿å颿°Sumãd => d.UnitCountãšFunc<Detail,int>ã®äž¡æ¹ãšäºææ§ããããããäž¡æ¹ã®Func<Detail,double>ã¡ãœãããé©çšãããŸãã ãã ããSumãžã®å€æã¯Func<Detail,int>ãžã®å€æãããåªããŠããããããªãŒããŒããŒãã®è§£æ±ºã¯æåã®Func<Detail,double>ã¡ãœãããéžæããŸãã
orderDetails.Sumã® 2 åç®ã®åŒã³åºãã§ã¯ãå¿å颿°Sumãåd => d.UnitPrice * d.UnitCountã®å€ãçæããããã2 çªç®ã®doubleã¡ãœããã®ã¿ãé©çšãããŸãã ãããã£ãŠããªãŒããŒããŒã解決ã¯ããã®åŒã³åºãã® 2 çªç®ã®Sumã¡ãœãããéžæããŸããçµäºãµã³ãã«
12.22.5 å¿å颿°ãšåçãã€ã³ãã£ã³ã°
å¿å颿°ã¯ãåçã«ãã€ã³ããããæŒç®ã®åä¿¡è ãåŒæ°ããŸãã¯ãªãã©ã³ãã«ããããšã¯ã§ããŸããã
12.22.6 å€éšå€æ°
12.22.6.1 å šè¬
ã¹ã³ãŒãã«lambda_expressionãŸãã¯anonymous_method_expressionãå«ãããŒã«ã«å€æ°ãå€ãã©ã¡ãŒã¿ãŒããŸãã¯ãã©ã¡ãŒã¿ãŒ ã³ã¬ã¯ã·ã§ã³ã¯ãå¿å颿°ã®å€éšå€æ°ãšåŒã°ããŸãã ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹é¢æ°ã¡ã³ããŒã§ã¯ã this å€ã¯å€ãã©ã¡ãŒã¿ãŒãšèŠãªããã颿°ã¡ã³ããŒã«å«ãŸããå¿å颿°ã®å€éšå€æ°ã§ãã
修食å static ãååšããå Žåãå¿å颿°ã¯å€åŽã®ã¹ã³ãŒãããç¶æ
ããã£ããã£ã§ããŸããã ãã®çµæãå€åŽã®ã¹ã³ãŒãããã®ããŒã«ã«ããã©ã¡ãŒã¿ãŒãããã³ this ã¯ããã®å¿å颿°ã§ã¯äœ¿çšã§ããŸããã
12.22.6.2 ãã£ããã£ãããå€éšå€æ°
å€éšå€æ°ãå¿å颿°ã«ãã£ãŠåç §ãããŠããå Žåãå€éšå€æ°ã¯å¿å颿°ã«ãã£ãŠ ãã£ããã£ããã ãšèšãããŸãã éåžžãããŒã«ã«å€æ°ã®æå¹æéã¯ãé¢é£ä»ããããŠãããããã¯ãŸãã¯ã¹ããŒãã¡ã³ãã®å®è¡ã«å¶éãããŸã (§9.2.9.1)ã ãã ãããã£ããã£ãããå€éšå€æ°ã®æå¹æéã¯ãå°ãªããšãå¿å颿°ããäœæãããããªã²ãŒããŸãã¯åŒããªãŒãã¬ããŒãž ã³ã¬ã¯ã·ã§ã³ã®å¯Ÿè±¡ã«ãªããŸã§å»¶é·ãããŸãã
äŸ: ãã®äŸã§ã¯
delegate int D(); class Test { static D F() { int x = 0; D result = () => ++x; return result; } static void Main() { D d = F(); Console.WriteLine(d()); Console.WriteLine(d()); Console.WriteLine(d()); } }ããŒã«ã«å€æ°
xã¯å¿å颿°ã«ãã£ãŠãã£ããã£ãããxã®æå¹æéã¯ãå°ãªããšãFããè¿ãããããªã²ãŒããã¬ããŒãž ã³ã¬ã¯ã·ã§ã³ã®å¯Ÿè±¡ã«ãªããŸã§æ¡åŒµãããŸãã å¿å颿°ã®ååŒã³åºãã¯ãxã®åãã€ã³ã¹ã¿ã³ã¹ã§åäœãããããäŸã®åºåã¯æ¬¡ã®ããã«ãªããŸãã1 2 3çµäºãµã³ãã«
ããŒã«ã«å€æ°ãŸãã¯å€ãã©ã¡ãŒã¿ãŒãéstatic å¿å颿°ã«ãã£ãŠãã£ããã£ãããå ŽåãããŒã«ã«å€æ°ãŸãã¯ãã©ã¡ãŒã¿ãŒã¯åºå®å€æ° (§24.4) ãšèŠãªãããªããªããŸãããã代ããã«ç§»åå¯èœãªå€æ°ãšèŠãªãããŸãã ãã ãããã£ããã£ãããå€éšå€æ°ã¯ã fixed ã¹ããŒãã¡ã³ã (§24.7) ã§ã¯äœ¿çšã§ããªãããããã£ããã£ãããå€éšå€æ°ã®ã¢ãã¬ã¹ãååŸã§ããŸããã
泚æ: ãã£ããã£ãããŠããªã倿°ãšã¯ç°ãªãããã£ããã£ãããããŒã«ã«å€æ°ãè€æ°ã®å®è¡ã¹ã¬ããã«åæã«å ¬éã§ããŸãã æ³šé
12.22.6.3 ããŒã«ã«å€æ°ã®ã€ã³ã¹ã¿ã³ã¹å
ããŒã«ã«å€æ°ã¯ãå®è¡ã倿° ã¹ã³ãŒãã«å ¥ã£ããšãã« ã€ã³ã¹ã¿ã³ã¹å ããããšèŠãªãããŸãã
äŸ: ããšãã°ã次ã®ã¡ãœãããåŒã³åºããããšã
xããŒã«ã«å€æ°ãã€ã³ã¹ã¿ã³ã¹åããã3 ååæåãããŸããã«ãŒãã®å埩åŠçããšã« 1 åãstatic void F() { for (int i = 0; i < 3; i++) { int x = i * 2 + 1; ... } }ãã ãã
xã®å®£èšãã«ãŒãã®å€åŽã«ç§»åãããšãxãåäžã«ã€ã³ã¹ã¿ã³ã¹åãããŸããstatic void F() { int x; for (int i = 0; i < 3; i++) { x = i * 2 + 1; ... } }çµäºãµã³ãã«
ãã£ããã£ãããªãå ŽåãããŒã«ã«å€æ°ãã€ã³ã¹ã¿ã³ã¹åãããé »åºŠãæ£ç¢ºã«ç¢ºèªããæ¹æ³ã¯ãããŸãããã€ã³ã¹ã¿ã³ã¹åã®æå¹æéã¯äžæŽåã§ãããããã€ã³ã¹ã¿ã³ã¹åããšã«åãã¹ãã¬ãŒãžã®å Žæã䜿çšã§ããŸãã ãã ããstatic ã§ãªãå¿å颿°ãããŒã«ã«å€æ°ããã£ããã£ãããšãã€ã³ã¹ã¿ã³ã¹åã®å¹æãæããã«ãªããŸãã
äŸ: ãã®äŸ
delegate void D(); class Test { static D[] F() { D[] result = new D[3]; for (int i = 0; i < 3; i++) { int x = i * 2 + 1; result[i] = () => Console.WriteLine(x); } return result; } static void Main() { foreach (D d in F()) { d(); } } }åºåãçæããŸãã
1 3 5ãã ãã
xã®å®£èšãã«ãŒãã®å€åŽã«ç§»åãããå Žå:delegate void D(); class Test { static D[] F() { D[] result = new D[3]; int x; for (int i = 0; i < 3; i++) { x = i * 2 + 1; result[i] = () => Console.WriteLine(x); } return result; } static void Main() { foreach (D d in F()) { d(); } } }åºåã¯æ¬¡ã®ããã«ãªããŸãã
5 5 5ã³ã³ãã€ã©ã¯ã3 ã€ã®ã€ã³ã¹ã¿ã³ã¹åãåäžã®ããªã²ãŒã ã€ã³ã¹ã¿ã³ã¹ (§10.7.2) ã«æé©åããããšãèš±å¯ãããŠããããšã«æ³šæããŠãã ãã (ãã ããå¿ é ã§ã¯ãããŸãã)ã
çµäºãµã³ãã«
for ã«ãŒãã§ååŸ©å€æ°ã宣èšãããŠããå Žåããã®å€æ°èªäœã¯ã«ãŒãã®å€éšã§å®£èšãããŠãããšèŠãªãããŸãã
äŸ: ãããã£ãŠãååŸ©å€æ°èªäœããã£ããã£ããããã«äŸã倿Žãããå Žå:
delegate void D(); class Test { static D[] F() { D[] result = new D[3]; for (int i = 0; i < 3; i++) { result[i] = () => Console.WriteLine(i); } return result; } static void Main() { foreach (D d in F()) { d(); } } }ååŸ©å€æ°ã®ã€ã³ã¹ã¿ã³ã¹ã 1 ã€ã ããã£ããã£ãããåºåãçæãããŸãã
3 3 3çµäºãµã³ãã«
static以å€ã®å¿å颿°ããªã²ãŒãã¯ããã£ããã£ããã倿°ã®äžéšãå
±æããå¥ã®ã€ã³ã¹ã¿ã³ã¹ãæã€ããšãã§ããŸãã
äŸã®: ããšãã°ã
Fã«å€æŽãããå Žåstatic D[] F() { D[] result = new D[3]; int x = 0; for (int i = 0; i < 3; i++) { int y = 0; result[i] = () => Console.WriteLine($"{++x} {++y}"); } return result; }3 ã€ã®ããªã²ãŒãã¯ã
xã®åãã€ã³ã¹ã¿ã³ã¹ããã£ããã£ããŸãããyã®åå¥ã®ã€ã³ã¹ã¿ã³ã¹ããã£ããã£ããåºåã¯æ¬¡ã®ããã«ãªããŸãã1 1 2 1 3 1çµäºãµã³ãã«
åå¥ã®éstatic å¿å颿°ã¯ãå€éšå€æ°ã®åãã€ã³ã¹ã¿ã³ã¹ããã£ããã£ã§ããŸãã
äŸ: ãã®äŸã§ã¯
delegate void Setter(int value); delegate int Getter(); class Test { static void Main() { int x = 0; Setter s = (int value) => x = value; Getter g = () => x; s(5); Console.WriteLine(g()); s(10); Console.WriteLine(g()); } }2 ã€ã®å¿å颿°ã¯ã
xããŒã«ã«å€æ°ã®åãã€ã³ã¹ã¿ã³ã¹ããã£ããã£ããããããã®å€æ°ãä»ã㊠"éä¿¡" ã§ããŸãã åºåã¯æ¬¡ã®ãšããã§ãã5 10çµäºãµã³ãã«
12.22.7 å¿å颿°åŒã®è©äŸ¡
å¿å颿° F ã¯ãåžžã«ããªã²ãŒãå D ãŸãã¯åŒããªãŒå Eã«ãçŽæ¥ããŸãã¯ããªã²ãŒãäœæåŒ new D(F)ã®å®è¡ã«ãã£ãŠå€æãããŸãã ãã®å€æã¯ã §10.7ã§èª¬æãããŠããããã«ãå¿å颿°ã®çµæã決å®ããŸãã
12.22.8 å¿å颿°å
å¿å颿°åŒ (§10.2.21) ãããªã²ãŒãåãŸã㯠Expression å (§8.6) ã«å€æãããšããã®å¿å颿°åŒã¯ èªç¶åã§ãããšèšãããŸãã ãã ããèš±å¯ããã«ã¯ãååãªæ
å ±ãæäŸãŸãã¯æšè«ããå¿
èŠããããŸãã æ¬¡ã®ç¹ãèæ
®ããŠãã ããã
var parse1 = (string s) => int.Parse(s);
var parse2 = delegate (string s) { return int.Parse(s); };
ã©ã¡ãã®å Žåããã¿ãŒã²ããã®åã Func<string, int>ãšããŠæšè«ã§ããããã代ããã« var ã䜿çšã§ããŸãã ã³ã³ãã€ã©ã¯ã䜿çšå¯èœãª Func ãŸã㯠Action ããªã²ãŒããéžæããé©åãªããªã²ãŒããååšããå Žåã¯ããªã²ãŒããéžæããŸãããã以å€ã®å Žåã¯ãããªã²ãŒãåãåæããŸã (ref ãã©ã¡ãŒã¿ãŒãããå Žåã¯å®è¡ãããŸã)ã
ãã ãããã¹ãŠã®å¿å颿°åŒã«èªç¶ãªåãããããã§ã¯ãããŸããã æ¬¡ã®ç¹ãèæ ®ããŠãã ããã
var parse3 = s => int.Parse(s); // error: type could not be inferred
å¿å颿°åŒã¯ããã©ã¡ãŒã¿ãŒã®åãæç€ºçã§ãæ»ãå€ã®åãæç€ºçã§ããããæšè«å¯èœãªå Žåãèªç¶ãªåãæã£ãŠããŸãã
èªç¶åãæã€å¿å颿°åŒã¯ãããŸãæç€ºçã§ãªãåã®ã³ã³ããã¹ãã§äœ¿çšã§ããŸãã
object parse4 = (string s) => int.Parse(s);
Delegate parse5 = (string s) => int.Parse(s);
ã¡ãœãã ã°ã«ãŒãå
ã®ãã¹ãŠã®åè£ã¡ãœãã (æ¡åŒµã¡ãœãããå«ã) ã«æ¢å®å€ã params 修食åãå«ãå
±éã®ã·ã°ããã£ãããå Žåãã¡ãœãã ã°ã«ãŒãã«ã¯èªç¶ãªåããããŸãã
ã¡ãœãã ã°ã«ãŒãã«èªç¶åããããã©ããã倿ããã«ã¯ãæ¬¡ã®æé ãå®è¡ããŸããããã«ã¯ãã¹ã³ãŒãããšã«ç§»åããã§ããã ãæ©ãæåã§ããªãåè£ãæé€ããå¿ èŠããããŸã (ãªãŒããŒããŒãã®è§£æ±ºãšåæ§)ã
- ã¹ã³ãŒãããšã«ããã¹ãŠã®åè£ã¡ãœããã®ã»ãããæ§ç¯ãããŸãã
- åæã¹ã³ãŒãã®å Žåãæå®ãããååŒæ°ãšäžèŽããã¢ãªãã£ãæã€é¢é£ããåã®ã¡ãœãããšãæå®ãããååŒæ°ãšã®å¶çŽãæºããã¡ãœããã¯ãããããéçã§ãããåä¿¡åŽãåã§ããå ŽåããŸãã¯ééçã§ãããåä¿¡åŽãå€ã§ããå Žåã¯ã»ããå ã«ãããŸãã
- åŸç¶ã®ã¹ã³ãŒãã®å Žåãæå®ãããååŒæ°ã«çœ®ãæããŠãå¶çŽãæºãããªããåä¿¡åŽã®å€ã䜿çšããŠåæžã§ããããã®ã¹ã³ãŒãå
ã®æ¡åŒµã¡ãœãããã»ããå
ã«ãããŸãã
- æå®ãããã¹ã³ãŒãã«åè£ãããå Žåã¯ã次ã®ã¹ã³ãŒãã«é²ã¿ãŸãã
- ãã¹ãŠã®åè£ã®ã·ã°ããã£ãäžèŽããªãå Žåãã¡ãœãã ã°ã«ãŒãã«ã¯èªç¶ãªåã¯ãããŸããã
- ãã以å€ã®å Žåã¯ãçµæã®ã·ã°ããã£ãèªç¶ãªåãšããŠäœ¿çšãããŸãã
- ã¹ã³ãŒãã䜿ãæããããå Žåãã¡ãœãã ã°ã«ãŒãã«ã¯èªç¶ãªåã¯ãããŸããã
var read = Console.Read; // Just one overload; Func<int> inferred
var write = Console.Write; // error: multiple overloads, can't choose
å¿å颿°åŒã LambdaExpression ãŸã㯠Expressionã®ã³ã³ããã¹ãã§äœ¿çšãããå¿å颿°åŒã«èªç¶ãªããªã²ãŒãåãããå Žåãçµæã®åŒã«ã¯ãåãã©ã¡ãŒã¿ãŒã®åŒæ°ãšããŠäœ¿çšãããèªç¶ããªã²ãŒãåãæã€èªç¶ãªåã® Expression<TDelegate> ããããŸãã
LambdaExpression parseExpr = (string s) => int.Parse(s);
// Expression<Func<string, int>>
Expression parseExpr = (string s) => int.Parse(s);
// Expression<Func<string, int>>
å¿å颿°åŒãŸãã¯ã¡ãœãã ã°ã«ãŒãã®èªç¶åã¯ã å¿å颿°åãšåŒã°ããŸãã å¿å颿°åã¯ãã¡ãœãã ã·ã°ããã£ã衚ããŸãããã©ã¡ãŒã¿ãŒã®åãš ref ã®çš®é¡ãæ¢å®å€ã params 修食åãæ»ãå€ã®åãš ref ã®çš®é¡ã§ãã åãã·ã°ããã£ãæã€å¿å颿°åŒãŸãã¯ã¡ãœãã ã°ã«ãŒãã¯ãåãå¿å颿°åãæã£ãŠããŸãã
å¿å颿°åã¯ãããã€ãã®ç¹å®ã®ã³ã³ããã¹ãã§ã®ã¿äœ¿çšãããŸãã
- æé»çããã³æç€ºçãªå€æã
- ã¡ãœããåã®æšè« (§12.6.3) ãšæãäžè¬çãªå (§12.6.3.17)ã
- implicitly_typed_local_variable_declaratorã®åæåååŒ (§13.6.2.2)ã
å¿å颿°åã¯ã³ã³ãã€ã«æã«ã®ã¿ååšããŸãã
ãã©ã¡ãŒã¿ãŒåã P1, ..., Pn ãããæ»ãå€ã®åã R å¿å颿°ãŸãã¯ã¡ãœãã ã°ã«ãŒãã®ããªã²ãŒãåã¯æ¬¡ã®ãšããã§ãã
- ãã©ã¡ãŒã¿ãŒãŸãã¯æ»ãå€ãå€ã§ã¯ãªãå ŽåããŸãã¯ãã©ã¡ãŒã¿ãŒãçç¥å¯èœãŸãã¯
paramsããŸã㯠16 åãè¶ ãããã©ã¡ãŒã¿ãŒãããå ŽåããŸãã¯ãã©ã¡ãŒã¿ãŒåãŸãã¯æ»ãå€ã®åãæå¹ãªååŒæ° ((int* p) => { }ãªã©) ã§ãªãå Žåãããªã²ãŒãã¯å¿å颿°ãŸãã¯ã¡ãœãã ã°ã«ãŒãã«äžèŽããã·ã°ããã£ãæã€åæãããinternalå¿åããªã²ãŒãåã§ãã ãã©ã¡ãŒã¿ãŒåãarg1, ..., argnã1 ã€ã®ãã©ã¡ãŒã¿ãŒã®å Žåã¯argã -
Rãvoidå Žåãããªã²ãŒãåã¯System.Action<P1, ..., Pn>ã - ãã以å€ã®å Žåãããªã²ãŒãåã¯
System.Func<P1, ..., Pn, R>ã
泚: ãã®ä»æ§ã®å°æ¥ã®ããŒãžã§ã³ã§ã¯ãããå€ãã®ã·ã°ããã£ã
System.Action<>åãšSystem.Func<>åã«ãã€ã³ãã§ããå ŽåããããŸã (ããšãã°ãref structåãèš±å¯ãããŠããå Žå)ã æ³šé
åãã³ã³ãã€ã«å ã® 2 ã€ã®å¿å颿°ãŸãã¯ã¡ãœãã ã°ã«ãŒãã§ãåããã©ã¡ãŒã¿ãŒåãšä¿®é£Ÿåãæã€åæããªã²ãŒãåãšãåãæ»ãå€ã®åãšä¿®é£Ÿåãå¿ èŠãªå Žåãã³ã³ãã€ã©ã¯åãåæããªã²ãŒãåã䜿çšããŸãã
12.22.9 å®è£ äŸ
ãã®ãµãã¯ã©ã¹ã¯æçã§ãã
ãã®ãµãã¯ã©ãŠãºã§ã¯ãä»ã® C# ã³ã³ã¹ãã©ã¯ãã®èгç¹ããå¿å颿°å€æãå®è£ ããå¯èœæ§ã«ã€ããŠèª¬æããŸãã ããã§èª¬æããå®è£ ã¯ãåçš C# ã³ã³ãã€ã©ã§äœ¿çšãããã®ãšåãååã«åºã¥ããŠããŸãããæ±ºããŠå¿ é ã®å®è£ ã§ã¯ãªããå¯èœãªå¯äžã®å®è£ ã§ããããŸããã åŒããªãŒãžã®å€æã«ã€ããŠã¯ãå³å¯ãªã»ãã³ãã£ã¯ã¹ããã®ä»æ§ã®ç¯å²å€ã§ãããããç°¡åã«èª¬æããã ãã§ãã
ãã®ãµãããã¥ã¡ã³ãã®æ®ãã®éšåã§ã¯ãç°ãªãç¹æ§ãæã€å¿å颿°ãå«ãã³ãŒãã®äŸãããã€ã瀺ããŸãã åäŸã§ã¯ãä»ã® C# ã³ã³ã¹ãã©ã¯ãã®ã¿ã䜿çšããã³ãŒããžã®å¯Ÿå¿ãã翻蚳ãæäŸãããŸãã äŸã§ã¯ãèå¥å D ã¯ã次ã®ããªã²ãŒãåã衚ããŠãããšèŠãªãããŸãã
public delegate void D();
å¿å颿°ã®æãç°¡åãªåœ¢åŒã¯ãå€éšå€æ°ããã£ããã£ããªã颿°ã§ãã
delegate void D();
class Test
{
static void F()
{
D d = () => Console.WriteLine("test");
}
}
ããã¯ãå¿å颿°ã®ã³ãŒããé 眮ãããã³ã³ãã€ã©ã«ãã£ãŠçæãããéçã¡ãœãããåç §ããããªã²ãŒãã€ã³ã¹ã¿ã³ã¹åã«å€æã§ããŸãã
delegate void D();
class Test
{
static void F()
{
D d = new D(__Method1);
}
static void __Method1()
{
Console.WriteLine("test");
}
}
次ã®äŸã§ã¯ãå¿å颿°ã¯ thisã®ã€ã³ã¹ã¿ã³ã¹ ã¡ã³ããŒãåç
§ããŸãã
delegate void D();
class Test
{
int x;
void F()
{
D d = () => Console.WriteLine(x);
}
}
ããã¯ãå¿å颿°ã®ã³ãŒããå«ãã³ã³ãã€ã©ã«ãã£ãŠçæãããã€ã³ã¹ã¿ã³ã¹ ã¡ãœããã«å€æã§ããŸãã
delegate void D();
class Test
{
int x;
void F()
{
D d = new D(__Method1);
}
void __Method1()
{
Console.WriteLine(x);
}
}
ãã®äŸã§ã¯ãå¿å颿°ã¯ããŒã«ã«å€æ°ããã£ããã£ããŸãã
delegate void D();
class Test
{
void F()
{
int y = 123;
D d = () => Console.WriteLine(y);
}
}
ããŒã«ã«å€æ°ã®æå¹æéããå°ãªããšãå¿å颿°ããªã²ãŒãã®æå¹æéã«æ¡åŒµããå¿ èŠããããŸãã ããã¯ãããŒã«ã«å€æ°ãã³ã³ãã€ã©ã«ãã£ãŠçæãããã¯ã©ã¹ã®ãã£ãŒã«ãã« "ãã€ã¹ã" ããããšã«ãã£ãŠå®çŸã§ããŸãã ããŒã«ã«å€æ° (§12.22.6.3) ã®ã€ã³ã¹ã¿ã³ã¹åã¯ãã³ã³ãã€ã©ã«ãã£ãŠçæãããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã®äœæã«å¯Ÿå¿ããããŒã«ã«å€æ°ãžã®ã¢ã¯ã»ã¹ã¯ãã³ã³ãã€ã©ã«ãã£ãŠçæãããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹å ã®ãã£ãŒã«ããžã®ã¢ã¯ã»ã¹ã«å¯Ÿå¿ããŸãã ããã«ãå¿å颿°ã¯ãã³ã³ãã€ã©ã«ãã£ãŠçæãããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ ã¡ãœããã«ãªããŸãã
delegate void D();
class Test
{
void F()
{
__Locals1 __locals1 = new __Locals1();
__locals1.y = 123;
D d = new D(__locals1.__Method1);
}
class __Locals1
{
public int y;
public void __Method1()
{
Console.WriteLine(y);
}
}
}
æåŸã«ã次ã®å¿å颿°ã¯ã this ãšãæå¹æéãç°ãªã 2 ã€ã®ããŒã«ã«å€æ°ããã£ããã£ããŸãã
delegate void D();
class Test
{
int x;
void F()
{
int y = 123;
for (int i = 0; i < 10; i++)
{
int z = i * 2;
D d = () => Console.WriteLine(x + y + z);
}
}
}
ããã§ã¯ãç°ãªããããã¯å
ã®ããŒã«ã«ãç¬ç«ããæå¹æéãæã€ããšãã§ããããã«ãããŒã«ã«ããã£ããã£ããããããã¯ããšã«ã³ã³ãã€ã©ã«ãã£ãŠçæãããã¯ã©ã¹ãäœæãããŸãã å
éšãããã¯ã®ã³ã³ãã€ã©ã«ãã£ãŠçæãããã¯ã©ã¹ã§ãã __Locals2ã®ã€ã³ã¹ã¿ã³ã¹ã«ã¯ãããŒã«ã«å€æ°ã® z ãšã__Locals1ã®ã€ã³ã¹ã¿ã³ã¹ãåç
§ãããã£ãŒã«ããå«ãŸããŸãã å€éšãããã¯ã®ã³ã³ãã€ã©ã«ãã£ãŠçæãããã¯ã©ã¹ã§ãã __Locals1ã®ã€ã³ã¹ã¿ã³ã¹ã«ã¯ãããŒã«ã«å€æ° y ãšãå€åŽã®é¢æ°ã¡ã³ããŒã® this ãåç
§ãããã£ãŒã«ããå«ãŸããŠããŸãã ãããã®ããŒã¿æ§é ã䜿çšãããšã __Local2ã®ã€ã³ã¹ã¿ã³ã¹ãä»ããŠãã£ããã£ããããã¹ãŠã®å€éšå€æ°ã«å°éããããšãã§ããå¿å颿°ã®ã³ãŒãããã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ ã¡ãœãããšããŠå®è£
ã§ããŸãã
delegate void D();
class Test
{
int x;
void F()
{
__Locals1 __locals1 = new __Locals1();
__locals1.__this = this;
__locals1.y = 123;
for (int i = 0; i < 10; i++)
{
__Locals2 __locals2 = new __Locals2();
__locals2.__locals1 = __locals1;
__locals2.z = i * 2;
D d = new D(__locals2.__Method1);
}
}
class __Locals1
{
public Test __this;
public int y;
}
class __Locals2
{
public __Locals1 __locals1;
public int z;
public void __Method1()
{
Console.WriteLine(__locals1.__this.x + __locals1.y + z);
}
}
}
ããŒã«ã«å€æ°ããã£ããã£ããããã«ããã§é©çšããã®ãšåãææ³ã¯ãå¿å颿°ãåŒããªãŒã«å€æãããšãã«ã䜿çšã§ããŸããã³ã³ãã€ã©ã«ãã£ãŠçæããããªããžã§ã¯ããžã®åç §ã¯åŒããªãŒã«æ ŒçŽã§ããããŒã«ã«å€æ°ãžã®ã¢ã¯ã»ã¹ã¯ããããã®ãªããžã§ã¯ãã«å¯Ÿãããã£ãŒã«ã ã¢ã¯ã»ã¹ãšããŠè¡šãããšãã§ããŸãã ãã®æ¹æ³ã®å©ç¹ã¯ãããªã²ãŒããšåŒããªãŒã®éã§ "ãªããããã" ããŒã«ã«å€æ°ãå ±æã§ããç¹ã§ãã
æ å ±ããã¹ãã®æ«å°Ÿã
12.23 ã¯ãšãªåŒ
12.23.1 å šè¬
ã¯ãšãªåŒ ã¯ãSQL ã XQuery ãªã©ã®ãªã¬ãŒã·ã§ãã«ããã³éå±€åã¯ãšãªèšèªã«äŒŒãã¯ãšãªã®èšèªçµ±åæ§æãæäŸããŸãã
query_expression
: from_clause query_body
;
from_clause
: 'from' type? identifier 'in' expression
;
query_body
: query_body_clause* select_or_group_clause query_continuation?
;
query_body_clause
: from_clause
| let_clause
| where_clause
| join_clause
| join_into_clause
| orderby_clause
;
let_clause
: 'let' identifier '=' expression
;
where_clause
: 'where' boolean_expression
;
join_clause
: 'join' type? identifier 'in' expression 'on' expression
'equals' expression
;
join_into_clause
: 'join' type? identifier 'in' expression 'on' expression
'equals' expression 'into' identifier
;
orderby_clause
: 'orderby' orderings
;
orderings
: ordering (',' ordering)*
;
ordering
: expression ordering_direction?
;
ordering_direction
: 'ascending'
| 'descending'
;
select_or_group_clause
: select_clause
| group_clause
;
select_clause
: 'select' expression
;
group_clause
: 'group' expression 'by' expression
;
query_continuation
: 'into' identifier query_body
;
ã¯ãšãªåŒã¯ã from å¥ã§å§ãŸãã select å¥ãŸã㯠group å¥ã§çµãããŸãã æåã® from å¥ã®åŸã«ã0 å以äžã® fromã letã whereã join ãŸã㯠orderby å¥ãæå®ã§ããŸãã å from å¥ã¯ã ã·ãŒã±ã³ã¹ã®èŠçŽ ã«å¯ŸããŠç¯å²ãæå®ãã ç¯å²å€æ° ãå°å
¥ãããžã§ãã¬ãŒã¿ãŒã§ãã å let å¥ã«ã¯ãåã®ç¯å²å€æ°ã䜿çšããŠèšç®ãããå€ã衚ãç¯å²å€æ°ãå°å
¥ãããŠããŸãã å where å¥ã¯ãçµæããé
ç®ãé€å€ãããã£ã«ã¿ãŒã§ãã å join å¥ã¯ããœãŒã¹ ã·ãŒã±ã³ã¹ã®æå®ãããããŒãå¥ã®ã·ãŒã±ã³ã¹ã®ããŒãšæ¯èŒããäžèŽãããã¢ãçæããŸãã å orderby å¥ã¯ãæå®ããæ¡ä»¶ã«åŸã£ãŠé
ç®ãäžŠã¹æ¿ããŸããæåŸã® select å¥ãŸã㯠group å¥ã¯ãç¯å²å€æ°ã®èгç¹ããçµæã®åœ¢ç¶ãæå®ããŸãã æåŸã«ã1 ã€ã®ã¯ãšãªã®çµæãåŸç¶ã®ã¯ãšãªã®ãžã§ãã¬ãŒã¿ãŒãšããŠæ±ãããšã§ã into å¥ã䜿çšããŠã¯ãšãªã "ã¹ãã©ã€ã¹" ã§ããŸãã
12.23.2 ã¯ãšãªåŒã®ãããŸãã
ã¯ãšãªåŒã§ã¯ãããŸããŸãªã³ã³ããã¹ã ããŒã¯ãŒã (§6.4.4): ascendingã byã descendingã equalsã fromã groupã intoã joinã letã onã orderbyã select ããã³ whereã䜿çšããŸãã
ãããã®èå¥åãããŒã¯ãŒããšåçŽåã®äž¡æ¹ãšããŠäœ¿çšããããšã«ãã£ãŠçããå¯èœæ§ã®ãããããŸãããåé¿ããããã«ããããã®èå¥åã¯ã"@" (§6.4.4) ã§ãã¬ãã£ãã¯ã¹ãä»ããŠããå Žåãé€ããã¯ãšãªåŒå
ã®ä»»æã®å Žæã§ããŒã¯ãŒããšèŠãªãããŸãããã®å Žåãèå¥åãšèŠãªãããŸãã ãã®ãããã¯ãšãªåŒã¯ã"fromèå¥å" ã§å§ãŸãããã®åŸã« ";"ã"=" ãŸã㯠"," ãé€ãä»»æã®ããŒã¯ã³ã§å§ãŸãä»»æã®åŒã§ãã
12.23.3 ã¯ãšãªåŒã®å€æ
12.23.3.1 å šè¬
C# èšèªã§ã¯ãã¯ãšãªåŒã®å®è¡ã»ãã³ãã£ã¯ã¹ã¯æå®ãããŸããã ã¯ãšãªåŒã¯ãã¯ãšãªåŒãã¿ãŒã³ (§12.23.4) ã«æºæ ããã¡ãœããã®åŒã³åºãã«å€æãããŸãã å
·äœçã«ã¯ãã¯ãšãªåŒã¯ãWhereã Selectã SelectManyã Joinã GroupJoinã OrderByã OrderByDescendingã ThenByã ThenByDescendingã GroupByãããã³ Castãšããååã®ã¡ãœããã®åŒã³åºãã«å€æãããŸãã ãããã®ã¡ãœããã«ã¯ã §12.23.4 ã§èª¬æãããŠããããã«ãç¹å®ã®ã·ã°ããã£ãšæ»ãå€ã®åãå¿
èŠã§ãã ãããã®ã¡ãœããã¯ãã¯ãšãªå¯Ÿè±¡ã®ãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ ã¡ãœããããŸãã¯ãªããžã§ã¯ãã®å€éšã«ããæ¡åŒµã¡ãœããã§ããå ŽåããããŸãã ãããã®ã¡ãœããã¯ãã¯ãšãªã®å®éã®å®è¡ãå®è£
ããŸãã
ã¯ãšãªåŒããã¡ãœããåŒã³åºããžã®å€æã¯ãåãã€ã³ãã£ã³ã°ãŸãã¯ãªãŒããŒããŒãã®è§£æ±ºãå®è¡ãããåã«çºçããæ§æãããã³ã°ã§ãã ã¯ãšãªåŒã®ç¿»èš³åŸãçµæã®ã¡ãœããåŒã³åºãã¯éåžžã®ã¡ãœããåŒã³åºããšããŠåŠçãããã³ã³ãã€ã«æãšã©ãŒãæããã«ãããå¯èœæ§ããããŸãã ãããã®ãšã©ãŒæ¡ä»¶ã«ã¯ãååšããªãã¡ãœãããééã£ãåã®åŒæ°ãåæšè«ã倱æãããžã§ããªã㯠ã¡ãœãããå«ãŸããŸããããããã«éå®ãããŸããã
ã¯ãšãªåŒã¯ããããªãåæžãäžå¯èœã«ãªããŸã§ã次ã®ç¿»èš³ãç¹°ãè¿ãé©çšããããšã«ãã£ãŠåŠçãããŸãã 翻蚳ã¯ã¢ããªã±ãŒã·ã§ã³ã®é åºã§äžèŠ§è¡šç€ºãããŸããåã»ã¯ã·ã§ã³ã§ã¯ãåã®ã»ã¯ã·ã§ã³ã®ç¿»èš³ãå®å šã«å®è¡ãããŠããããšãåæãšããŠããã䜿ãæãããããšãåãã¯ãšãªåŒã®åŠçã§ã»ã¯ã·ã§ã³ãåŸã§åæ€èšãããããšã¯ãããŸããã
ç¯å²å€æ°ãžã®ä»£å ¥ãå«ããã¯ãšãªåŒã®ã³ã³ãã€ã«æãšã©ãŒã§ãããŸãã¯ãåç §ãŸãã¯åºåãã©ã¡ãŒã¿ãŒã®åŒæ°ãšããŠç¯å²å€æ°ã䜿çšããŸãã
ç¹å®ã®ç¿»èš³ã§ã¯ã*ã§ç€ºãããééçãªèå¥åãæã€ç¯å²å€æ°ãæ¿å ¥ãããŸãã ãããã¯ã §12.23.3.8 ã§è©³ãã説æãããŠããŸãã
12.23.3.2 ç¶ç¶ãå«ãã¯ãšãªåŒ
ã¯ãšãªæ¬æã«ç¶ãç¶ç¶ãããã¯ãšãªåŒ
from «x1» in «e1» «b1» into «x2» «b2»
ãšç¿»èš³ãããŸã
from «x2» in ( from «x1» in «e1» «b1» ) «b2»
次ã®ã»ã¯ã·ã§ã³ã®ç¿»èš³ã§ã¯ãã¯ãšãªã«ç¶ç¶ããªãããšãåæãšããŠããŸãã
äŸ: äŸ
from c in customers group c by c.Country into g select new { Country = g.Key, CustCount = g.Count() }次ã®ããã«ç¿»èš³ãããŸãã
from g in (from c in customers group c by c.Country) select new { Country = g.Key, CustCount = g.Count() }æåŸã®ç¿»èš³ã¯æ¬¡ã®ãšããã§ãã
customers. GroupBy(c => c.Country). Select(g => new { Country = g.Key, CustCount = g.Count() })çµäºãµã³ãã«
12.23.3.3 æç€ºçãªç¯å²å€æ°å
ç¯å²å€æ°åãæç€ºçã«æå®ãã from å¥
from «T» «x» in «e»
ãšç¿»èš³ãããŸã
from «x» in ( «e» ) . Cast < «T» > ( )
ç¯å²å€æ°åãæç€ºçã«æå®ãã join å¥
join «T» «x» in «e» on «k1» equals «k2»
ãšç¿»èš³ãããŸã
join «x» in ( «e» ) . Cast < «T» > ( ) on «k1» equals «k2»
次ã®ã»ã¯ã·ã§ã³ã®ç¿»èš³ã§ã¯ãã¯ãšãªã«æç€ºçãªç¯å²å€æ°åããªãããšãåæãšããŠããŸãã
äŸ: ãã®äŸ
from Customer c in customers where c.City == "London" select cãšç¿»èš³ãããŸã
from c in (customers).Cast<Customer>() where c.City == "London" select cæåŸã®ç¿»èš³ã¯æ¬¡ã®ãšããã§ã
customers. Cast<Customer>(). Where(c => c.City == "London")çµäºãµã³ãã«
泚: æç€ºçãªç¯å²å€æ°åã¯ãéãžã§ããªãã¯
IEnumerableã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããã³ã¬ã¯ã·ã§ã³ã«å¯ŸããŠã¯ãšãªãå®è¡ããå Žåã«äŸ¿å©ã§ããããžã§ããªãã¯IEnumerable<T>ã€ã³ã¿ãŒãã§ã€ã¹ã¯äœ¿çšã§ããŸããã äžèšã®äŸã§ã¯ã顧客ãArrayListåã®å Žåã§ãã æ³šé
12.23.3.4 ã¯ãšãªåŒã®çæãè§£é€ãã
ã¯ãšãªåŒã®åœ¢åŒ
from «x» in «e» select «x»
ãšç¿»èš³ãããŸã
( «e» ) . Select ( «x» => «x» )
äŸ: ãã®äŸ
from c in customers select cãšç¿»èš³ãããŸã
(customers).Select(c => c)çµäºãµã³ãã«
å£åã¯ãšãªåŒãšã¯ããœãŒã¹ã®èŠçŽ ãèªæçã«éžæããåŒã§ãã
泚: 翻蚳ã®åŸã®ãã§ãŒãº (§12.23.3.6 ãã㳠§12.23.3.7) ã§ã¯ãä»ã®ç¿»èš³æé ã§å°å ¥ãããéåããã¯ãšãªããœãŒã¹ã«çœ®ãæããããšã§åé€ãããŸãã ãã ããã¯ãšãªåŒã®çµæããœãŒã¹ ãªããžã§ã¯ãèªäœã«ãªããªãããã«ããããšãéèŠã§ãã ããããªããšããã®ãããªã¯ãšãªã®çµæãè¿ããšããã©ã€ããŒã ããŒã¿ (èŠçŽ é åãªã©) ãåŒã³åºãå ã«èª€ã£ãŠå ¬éãããå¯èœæ§ããããŸãã ãããã£ãŠããã®æé ã§ã¯ããœãŒã¹ã§
Selectãæç€ºçã«åŒã³åºãããšã«ãã£ãŠããœãŒã¹ ã³ãŒãã§çŽæ¥èšè¿°ãããéåã¯ãšãªãä¿è·ããŸãã ãã®åŸããããã®ã¡ãœããããœãŒã¹ ãªããžã§ã¯ãèªäœãè¿ããªãããšãä¿èšŒããã®ã¯ãSelectããã³ãã®ä»ã®ã¯ãšãªæŒç®åã®å®è£ è ã«ããã£ãŠããŸãã æ³šé
12.23.3.5 Fromãletãwhereãjoinãorderby å¥
2 çªç®ã® from å¥ã®åŸã« select å¥ãç¶ãã¯ãšãªåŒ
from «x1» in «e1»
from «x2» in «e2»
select «v»
ãšç¿»èš³ãããŸã
( «e1» ) . SelectMany( «x1» => «e2» , ( «x1» , «x2» ) => «v» )
äŸ: ãã®äŸ
from c in customers from o in c.Orders select new { c.Name, o.OrderID, o.Total }ãšç¿»èš³ãããŸã
(customers). SelectMany(c => c.Orders, (c,o) => new { c.Name, o.OrderID, o.Total } )çµäºãµã³ãã«
2 ã€ç®ã® from å¥ã®åŸã«ã空ã§ãªãã¯ãšãªæ¬æå¥ã®ã»ãããå«ãã¯ãšãªæ¬æ Q ãããã¯ãšãªåŒã
from «x1» in «e1»
from «x2» in «e2»
Q
ãšç¿»èš³ãããŸã
from * in («e1») . SelectMany( «x1» => «e2» ,
( «x1» , «x2» ) => new { «x1» , «x2» } )
Q
äŸ: ãã®äŸ
from c in customers from o in c.Orders orderby o.Total descending select new { c.Name, o.OrderID, o.Total }ãšç¿»èš³ãããŸã
from * in (customers). SelectMany(c => c.Orders, (c,o) => new { c, o }) orderby o.Total descending select new { c.Name, o.OrderID, o.Total }æåŸã®ç¿»èš³ã¯æ¬¡ã®ãšããã§ã
customers. SelectMany(c => c.Orders, (c,o) => new { c, o }). OrderByDescending(x => x.o.Total). Select(x => new { x.c.Name, x.o.OrderID, x.o.Total })ããã§ã
xã¯ã³ã³ãã€ã©ã«ãã£ãŠçæãããèå¥åã§ããããã以å€ã®å Žåã¯é衚瀺ã§ã¢ã¯ã»ã¹ã§ããŸãããçµäºãµã³ãã«
let åŒãšãã®åã® from å¥:
from «x» in «e»
let «y» = «f»
...
ãšç¿»èš³ãããŸã
from * in ( «e» ) . Select ( «x» => new { «x» , «y» = «f» } )
...
äŸ: ãã®äŸ
from o in orders let t = o.Details.Sum(d => d.UnitPrice * d.Quantity) where t >= 1000 select new { o.OrderID, Total = t }ãšç¿»èš³ãããŸã
from * in (orders).Select( o => new { o, t = o.Details.Sum(d => d.UnitPrice * d.Quantity) }) where t >= 1000 select new { o.OrderID, Total = t }æåŸã®ç¿»èš³ã¯æ¬¡ã®ãšããã§ã
orders .Select(o => new { o, t = o.Details.Sum(d => d.UnitPrice * d.Quantity) }) .Where(x => x.t >= 1000) .Select(x => new { x.o.OrderID, Total = x.t })ããã§ã
xã¯ã³ã³ãã€ã©ã«ãã£ãŠçæãããèå¥åã§ããããã以å€ã®å Žåã¯é衚瀺ã§ã¢ã¯ã»ã¹ã§ããŸãããçµäºãµã³ãã«
where åŒãšãã®åã® from å¥:
from «x» in «e»
where «f»
...
ãšç¿»èš³ãããŸã
from «x» in ( «e» ) . Where ( «x» => «f» )
...
join å¥ã®çŽåŸã« select å¥ãç¶ã
from «x1» in «e1»
join «x2» in «e2» on «k1» equals «k2»
select «v»
ãšç¿»èš³ãããŸã
( «e1» ) . Join( «e2» , «x1» => «k1» , «x2» => «k2» , ( «x1» , «x2» ) => «v» )
äŸ: ãã®äŸ
from c in customers join o in orders on c.CustomerID equals o.CustomerID select new { c.Name, o.OrderDate, o.Total }ãšç¿»èš³ãããŸã
(customers).Join( orders, c => c.CustomerID, o => o.CustomerID, (c, o) => new { c.Name, o.OrderDate, o.Total })çµäºãµã³ãã«
join å¥ã®åŸã«ã¯ãšãªæ¬æå¥ãç¶ããŸãã
from «x1» in «e1»
join «x2» in «e2» on «k1» equals «k2»
...
ãšç¿»èš³ãããŸã
from * in ( «e1» ) . Join(
«e2» , «x1» => «k1» , «x2» => «k2» ,
( «x1» , «x2» ) => new { «x1» , «x2» })
...
join
-
into ã®å¥ã®çŽåŸã« select ã®å¥ãç¶ã
from «x1» in «e1»
join «x2» in «e2» on «k1» equals «k2» into «g»
select «v»
ãšç¿»èš³ãããŸã
( «e1» ) . GroupJoin( «e2» , «x1» => «k1» , «x2» => «k2» ,
( «x1» , «g» ) => «v» )
join into å¥ã®åŸã«ã¯ãšãªæ¬æå¥ãç¶ããŸãã
from «x1» in «e1»
join «x2» in «e2» on «k1» equals «k2» into *g»
...
ãšç¿»èš³ãããŸã
from * in ( «e1» ) . GroupJoin(
«e2» , «x1» => «k1» , «x2» => «k2» , ( «x1» , «g» ) => new { «x1» , «g» })
...
äŸ: ãã®äŸ
from c in customers join o in orders on c.CustomerID equals o.CustomerID into co let n = co.Count() where n >= 10 select new { c.Name, OrderCount = n }ãšç¿»èš³ãããŸã
from * in (customers).GroupJoin( orders, c => c.CustomerID, o => o.CustomerID, (c, co) => new { c, co }) let n = co.Count() where n >= 10 select new { c.Name, OrderCount = n }æåŸã®ç¿»èš³ã¯æ¬¡ã®ãšããã§ã
customers .GroupJoin( orders, c => c.CustomerID, o => o.CustomerID, (c, co) => new { c, co }) .Select(x => new { x, n = x.co.Count() }) .Where(y => y.n >= 10) .Select(y => new { y.x.c.Name, OrderCount = y.n })ããã§ã
xãšyã¯ãã³ã³ãã€ã©çæèå¥åã§ããããã以å€ã®å Žåã¯é衚瀺ã§ã¢ã¯ã»ã¹ã§ããŸãããçµäºãµã³ãã«
orderby ç¯ãšãã®åã® from ç¯:
from «x» in «e»
orderby «k1» , «k2» , ... , «kn»
...
ãšç¿»èš³ãããŸã
from «x» in ( «e» ) .
OrderBy ( «x» => «k1» ) .
ThenBy ( «x» => «k2» ) .
... .
ThenBy ( «x» => «kn» )
...
ordering å¥ã§éé ã€ã³ãžã±ãŒã¿ãŒãæå®ãããŠããå Žåã¯ã代ããã« OrderByDescending ãŸã㯠ThenByDescending ã®åŒã³åºããçæãããŸãã
äŸ: ãã®äŸ
from o in orders orderby o.Customer.Name, o.Total descending select oæçµçãªç¿»èš³ããããŸã
(orders) .OrderBy(o => o.Customer.Name) .ThenByDescending(o => o.Total)çµäºãµã³ãã«
次ã®ç¿»èš³ã§ã¯ã letã whereã join å¥ããŸã㯠orderby å¥ããªããåã¯ãšãªåŒã«å«ãŸããæåã® from å¥ã 1 ã€ä»¥äžã§ããããšãåæãšããŠããŸãã
12.23.3.6 Select å¥
ã¯ãšãªåŒã®åœ¢åŒ
from «x» in «e» select «v»
ãšç¿»èš³ãããŸã
( «e» ) . Select ( «x» => «v» )
«v» ãèå¥å «x» ã§ããå Žåãé€ãã翻蚳ã¯åçŽã«
( «e» )
äŸ: ãã®äŸ
from c in customers.Where(c => c.City == "London") select cã¯åã«æ¬¡ã®ããã«ç¿»èš³ãããŸã
(customers).Where(c => c.City == "London")çµäºãµã³ãã«
12.23.3.7 Group å¥
group å¥
from «x» in «e» group «v» by «k»
ãšç¿»èš³ãããŸã
( «e» ) . GroupBy ( «x» => «k» , «x» => «v» )
«v» ãèå¥å «x» ã§ããå Žåãé€ãã翻蚳ã¯ã
( «e» ) . GroupBy ( «x» => «k» )
äŸ: ãã®äŸ
from c in customers group c.Name by c.Countryãšç¿»èš³ãããŸã
(customers).GroupBy(c => c.Country, c => c.Name)çµäºãµã³ãã«
12.23.3.8 ééçãªèå¥å
ç¹å®ã®å€æã§ã¯ãã§ç€ºãããs ãæã€ç¯å²å€æ°ãæ¿å ¥ãããŸãã ééçãªèå¥åã¯ãã¯ãšãªåŒå€æããã»ã¹ã®äžéã¹ããããšããŠã®ã¿ååšããŸãã
ã¯ãšãªå€æã«ãã£ãŠééçãªèå¥åãæ¿å ¥ããããšãããã«å€ææé ãå®è¡ãããšãééçãªèå¥åãå¿å颿°ãšå¿åãªããžã§ã¯ãåæååã«äŒéãããŸãã ãããã®ã³ã³ããã¹ãã§ã¯ãééçãªèå¥åã«ã¯æ¬¡ã®åäœããããŸãã
- ééçãªèå¥åãå¿å颿°ã®ãã©ã¡ãŒã¿ãŒãšããŠçºçãããšãé¢é£ä»ããããå¿ååã®ã¡ã³ããŒã¯ãå¿å颿°ã®æ¬äœã®ã¹ã³ãŒãå ã§èªåçã«æå¹ã«ãªããŸãã
- ééçãªèå¥åãæã€ã¡ã³ããŒãã¹ã³ãŒãå ã«ããå Žåããã®ã¡ã³ããŒã®ã¡ã³ããŒãã¹ã³ãŒãå ã«ãããŸãã
- ééçãªèå¥åãå¿åãªããžã§ã¯ãåæååã®ã¡ã³ããŒå®£èšåãšããŠçºçãããšãééçãªèå¥åãæã€ã¡ã³ããŒãå°å ¥ãããŸãã
äžèšã®å€ææé ã§ã¯ãééçãªèå¥åã¯ãè€æ°ã®ç¯å²å€æ°ã 1 ã€ã®ãªããžã§ã¯ãã®ã¡ã³ããŒãšããŠãã£ããã£ããããšãç®çãšããŠãå¿ååãšå ±ã«åžžã«å°å ¥ãããŸãã C# ã®å®è£ ã§ã¯ãå¿ååãšã¯ç°ãªãã¡ã«ããºã ã䜿çšããŠè€æ°ã®ç¯å²å€æ°ãã°ã«ãŒãåã§ããŸãã æ¬¡ã®ç¿»èš³ã®äŸã§ã¯ãå¿ååã䜿çšãããããšãåæãšããééçãªèå¥åã® 1 ã€ã®ç¿»èš³ã®å¯èœæ§ã瀺ããŠããŸãã
äŸ: ãã®äŸ
from c in customers from o in c.Orders orderby o.Total descending select new { c.Name, o.Total }ãšç¿»èš³ãããŸã
from * in (customers).SelectMany(c => c.Orders, (c,o) => new { c, o }) orderby o.Total descending select new { c.Name, o.Total }ããã« ã«å€æãããŸã
customers .SelectMany(c => c.Orders, (c,o) => new { c, o }) .OrderByDescending(* => o.Total) .Select(\* => new { c.Name, o.Total })ãã®å Žåãééçèå¥åãæ¶å»ããããšã次ãšåçã«ãªããŸãã
customers .SelectMany(c => c.Orders, (c,o) => new { c, o }) .OrderByDescending(x => x.o.Total) .Select(x => new { x.c.Name, x.o.Total })ããã§ã
xã¯ã³ã³ãã€ã©ã«ãã£ãŠçæãããèå¥åã§ããããã以å€ã®å Žåã¯é衚瀺ã§ã¢ã¯ã»ã¹ã§ããŸãããäŸ
from c in customers join o in orders on c.CustomerID equals o.CustomerID join d in details on o.OrderID equals d.OrderID join p in products on d.ProductID equals p.ProductID select new { c.Name, o.OrderDate, p.ProductName }ãšç¿»èš³ãããŸã
from * in (customers).Join( orders, c => c.CustomerID, o => o.CustomerID, (c, o) => new { c, o }) join d in details on o.OrderID equals d.OrderID join p in products on d.ProductID equals p.ProductID select new { c.Name, o.OrderDate, p.ProductName }ããã«æ¬¡ãŸã§æžå°ããŸã
customers .Join(orders, c => c.CustomerID, o => o.CustomerID, (c, o) => new { c, o }) .Join(details, * => o.OrderID, d => d.OrderID, (*, d) => new { *, d }) .Join(products, * => d.ProductID, p => p.ProductID, (*, p) => new { c.Name, o.OrderDate, p.ProductName })æåŸã®ç¿»èš³ã¯æ¬¡ã®ãšããã§ã
customers .Join(orders, c => c.CustomerID, o => o.CustomerID, (c, o) => new { c, o }) .Join(details, x => x.o.OrderID, d => d.OrderID, (x, d) => new { x, d }) .Join(products, y => y.d.ProductID, p => p.ProductID, (y, p) => new { y.x.c.Name, y.x.o.OrderDate, p.ProductName })ããã§ã
xãšyã¯ãã³ã³ãã€ã©çæèå¥åã§ããããã以å€ã®å Žåã¯é衚瀺ã§ã¢ã¯ã»ã¹ã§ããŸããã çµäºãµã³ãã«
12.23.4 ã¯ãšãªåŒãã¿ãŒã³
ã¯ãšãªåŒãã¿ãŒã³ ã¯ãåãã¯ãšãªåŒããµããŒãããããã«å®è£ ã§ããã¡ãœããã®ãã¿ãŒã³ã確ç«ããŸãã
ãããªã㯠ã¡ã³ã㌠ã¡ãœãããšãããªãã¯ã«ã¢ã¯ã»ã¹å¯èœãªæ¡åŒµã¡ãœãããæ¬¡ã®ã¯ã©ã¹å®çŸ©ã«çœ®ãæããããšãã§ããå Žåããžã§ããªãã¯å C<T> ã¯ã¯ãšãªåŒãã¿ãŒã³ããµããŒãããŸãã ã¡ã³ããŒãšã¢ã¯ã»ã¹å¯èœãªæ¡åŒµã¡ãœããã¯ããžã§ããªãã¯å C<T>ã® "shape" ãšåŒã°ããŸãã ãžã§ããªãã¯åã¯ããã©ã¡ãŒã¿ãŒãšæ»ãå€ã®åã®éã®é©åãªé¢ä¿ã瀺ãããã«äœ¿çšãããŸãããéãžã§ããªãã¯åã®ãã¿ãŒã³ãå®è£
ã§ããŸãã
delegate R Func<T1,R>(T1 arg1);
delegate R Func<T1,T2,R>(T1 arg1, T2 arg2);
class C
{
public C<T> Cast<T>() { ... }
}
class C<T> : C
{
public C<T> Where(Func<T,bool> predicate) { ... }
public C<U> Select<U>(Func<T,U> selector) { ... }
public C<V> SelectMany<U,V>(Func<T,C<U>> selector,
Func<T,U,V> resultSelector) { ... }
public C<V> Join<U,K,V>(C<U> inner, Func<T,K> outerKeySelector,
Func<U,K> innerKeySelector, Func<T,U,V> resultSelector) { ... }
public C<V> GroupJoin<U,K,V>(C<U> inner, Func<T,K> outerKeySelector,
Func<U,K> innerKeySelector, Func<T,C<U>,V> resultSelector) { ... }
public O<T> OrderBy<K>(Func<T,K> keySelector) { ... }
public O<T> OrderByDescending<K>(Func<T,K> keySelector) { ... }
public C<G<K,T>> GroupBy<K>(Func<T,K> keySelector) { ... }
public C<G<K,E>> GroupBy<K,E>(Func<T,K> keySelector,
Func<T,E> elementSelector) { ... }
}
class O<T> : C<T>
{
public O<T> ThenBy<K>(Func<T,K> keySelector) { ... }
public O<T> ThenByDescending<K>(Func<T,K> keySelector) { ... }
}
class G<K,T> : C<T>
{
public K Key { get; }
}
äžèšã®ã¡ãœããã§ã¯ããžã§ããªã㯠ããªã²ãŒãå Func<T1, R> ãš Func<T1, T2, R>ã䜿çšããŠããŸããããã©ã¡ãŒã¿ãŒãšæ»ãå€ã®åã§åããªã¬ãŒã·ã§ã³ã·ãããæã€ä»ã®ããªã²ãŒãåãŸãã¯åŒããªãŒåãåæ§ã«ãã䜿çšãããŠããå¯èœæ§ããããŸãã
泚æ:
C<T>ãšO<T>ã®éã§æšå¥šãããé¢ä¿ã«ãããThenByã¡ãœãããšThenByDescendingã¡ãœããã¯ãOrderByãŸãã¯OrderByDescendingã®çµæã§ã®ã¿äœ¿çšã§ããŸãã æ³šé
泚æ:
GroupByã®çµæã®æšå¥šãããåœ¢ç¶ ãã·ãŒã±ã³ã¹ã®ã·ãŒã±ã³ã¹ã§ãããåå éšã·ãŒã±ã³ã¹ã«ã¯è¿œå ã®Keyããããã£ããããŸãã æ³šé
泚: ã¯ãšãªåŒã¯æ§æãããã³ã°ã«ãã£ãŠã¡ãœããåŒã³åºãã«å€æããããããåã¯ã¯ãšãªåŒãã¿ãŒã³ã®äžéšãŸãã¯ãã¹ãŠãå®è£ ããæ¹æ³ã«å€§ããªæè»æ§ãæã¡ãŸãã ããšãã°ã2 ã€ã®åŒã³åºãæ§æãåãã§ãããå¿å颿°ã¯äž¡æ¹ã«å€æã§ãããããã¡ãœããã¯ããªã²ãŒããŸãã¯åŒããªãŒãèŠæ±ã§ããããããã¿ãŒã³ã®ã¡ãœãããã€ã³ã¹ã¿ã³ã¹ ã¡ãœãããŸãã¯æ¡åŒµã¡ãœãããšããŠå®è£ ã§ããŸãã äžéšã®ã¯ãšãªåŒãã¿ãŒã³ã®ã¿ãå®è£ ããåã§ã¯ãåããµããŒãããã¡ãœããã«ããããããã¯ãšãªåŒå€æã®ã¿ããµããŒããããŸãã æ³šé
泚:
System.Linqåå空éã¯ãSystem.Collections.Generic.IEnumerable<T>ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ãããã¹ãŠã®åã«å¯ŸããŠã¯ãšãªåŒãã¿ãŒã³ã®å®è£ ãæäŸããŸãã æ³šé
12.24 ä»£å ¥æŒç®å
12.24.1 å šè¬
assignment
: deconstructing_assignment
| simple_assignment
| compound_assignment
| ref_assignment
;
å ¥åã deconstructing_assignment ãšä»ã®ä»£æ¿ææ®µã®äž¡æ¹ãšããŠæ§æçã«èªèã§ããå Žåã¯ã deconstructing_assignment ãéžæããå¿ èŠããããŸãã
泚: ANTLR ææ³ã»ãã³ãã£ã¯ã¹ã§ã¯ãä»£æ¿ææ®µã®é åºä»ãã«ããããã®èŠä»¶ãé©çšãããŸãã æå³çã«ã¯ ã4 ã€ã®éžæè¢ã®éã«éè€ã¯ãããŸãããããã¯æ§æçãªãããŸããã§ãã
simple_assignmentåŒãšcompound_assignmentåŒã¯ã倿°ãããããã£ããŸãã¯ã€ã³ãã¯ãµãŒèŠçŽ ã«æ°ããå€ãå²ãåœãŠãŸãã compound_assignmentã®ãµãã»ããã§ããã€ãã³ãã®å²ãåœãŠ (§12.24.6) ã¯ãã€ãã³ãã«æ°ããå€ãå²ãåœãŠãŸãã ref_assignmentåŒã¯ã倿°åç § (§9.5) ãåç §å€æ° (§9.7) ã«å²ãåœãŠãŸãã deconstructing_assignmentã¯ããã³ã³ã¹ãã©ã¯ã¿ãŒã®éç Žæ£ã¿ãŒã²ããã«å€ãå²ãåœãŠãŸãã
simple_assignmentãref_assignmentããŸãã¯deconstructing_assignmentã®ã¿ãŒã²ããã®ã¿ãŒã²ããã¯ãç Žæ£ (§9.2.9.2) ã«ããããšãã§ããŸãã compound_assignmentã®å·Šãªãã©ã³ãã¯ç Žæ£ã§ããŸããã ä»£å ¥ã®å·Šãªãã©ã³ããç Žæ£ã®å Žåã察å¿ããå³èŸºåŒãè©äŸ¡ãããŸãããå€ã¯æ ŒçŽãããŸããã
åä»£æ¿ææ®µã¯ãåãäžè¬çãªåœ¢åŒã® l <op> rãåãåããŸããããã§ã <op> 㯠代å
¥æŒç®åã§ãã
代å
¥æŒç®åã¯å³çµåæ§ãæã£ãŠããŸããã€ãŸããæäœã¯å³ããå·Šã«ã°ã«ãŒãåãããŸãã
äŸ:
a = b = c圢åŒã®åŒãa = (b = c)ãšããŠè©äŸ¡ããŸãã çµäºãµã³ãã«
泚: ã€ãã³ãå²ãåœãŠ Â§12.24.6 ã§æå®ãããŠããããã«ã
+=æŒç®åãš-=æŒç®åã®å·Šãªãã©ã³ããã€ãã³ã ã¢ã¯ã»ã¹ãšããŠåé¡ãããå Žåãcompound_assignmentã¯å€ãçæããªããããe1 += e2 += fãše1ãã€ãã³ã ã¢ã¯ã»ã¹ã§ããe2ãã©ãŒã ã®åŒã¯ç¡å¹ã§ãããå³é¢é£ä»ãã§ã¯ãããŸããã
12.24.2 åçŽãªå²ãåœãŠ
simple_assignment
: unary_expression '=' expression
;
åçŽä»£å
¥ã§ã¯ã = æŒç®å㯠åçŽä»£å
¥æŒç®åãšåŒã°ããŸãã å·Šãªãã©ã³ããç Žæ£ã§ãªãå ŽåãåŒã¯å³ãªãã©ã³ãã®å€ãå·Šãªãã©ã³ãã«ãã£ãŠæå®ããã倿°ãããããã£ããŸãã¯ã€ã³ãã¯ãµãŒèŠçŽ ã«å²ãåœãŠãŸãã å·Šãªãã©ã³ããç Žæ£ã®å Žåãå³ãªãã©ã³ãã¯è©äŸ¡ãããŸãããå€ã¯æ ŒçŽãããŸããã åçŽä»£å
¥æŒç®åã®å·Šãªãã©ã³ãã¯ã §15.8.2 ã§èª¬æãããŠããã€ãã³ã ã¢ã¯ã»ã¹ã«ããããšãã§ããŸãã
åçŽä»£å
¥ã®å·Šãªãã©ã³ãã E.P 圢åŒãŸã㯠E[Eáµ¢] ã§ã E ãã³ã³ãã€ã«æã®å dynamicãæã€å Žåã代å
¥ã¯åçã«ãã€ã³ããããŸã (§12.3.3)ã ãã®å Žåã代å
¥åŒã®ã³ã³ãã€ã«æã®åã dynamicãããæ¬¡ã«ç€ºã解決ã¯å®è¡æã« Eã®åã«åºã¥ããŠå®è¡ãããŸãã å·Šãªãã©ã³ããåœ¢åŒ E[Eáµ¢] ã§ã Eáµ¢ ã®å°ãªããšã 1 ã€ã®èŠçŽ ãã³ã³ãã€ã«æå dynamicãæã¡ã E ã®ã³ã³ãã€ã«æã®åãé
åã§ãªãå Žåãçµæã®ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã¯åçã«ãã€ã³ããããŸãããã³ã³ãã€ã«æã®ãã§ãã¯ã¯å¶éãããŸã (§12.6.5)ã
åçŽãªä»£å
¥ x = y ã®åã¯ã xã® y ãžã®å²ãåœãŠã®åã§ãããæ¬¡ã®ããã«ååž°çã«æ±ºå®ãããŸãã
-
xã倿°ãšããŠåé¡ãããŠããå Žåã倿°ã¯readonlyããããxã¯åTãæã¡ãyã¯Tãžã®æé»çãªå€æãæã¡ãä»£å ¥ã«ã¯åTããããŸãã - ãã以å€ã®å Žåã
xãæé»çã«åæå®ããã倿° (ã€ãŸããæé»çã«åæå®ããã宣èšåŒ) ãšããŠåé¡ãããyãåTãæã€å Žåã倿°ã®æšè«ãããåã¯Tã§ãããä»£å ¥ã®åã¯Tã§ãã - ãã以å€ã®å Žåã
xãããããã£ã¢ã¯ã»ã¹ãŸãã¯ã€ã³ãã¯ãµãŒã¢ã¯ã»ã¹ãšããŠåé¡ãããŠããå Žåãããããã£ãŸãã¯ã€ã³ãã¯ãµãŒã¯ã¢ã¯ã»ã¹å¯èœãªã»ãããŸãã¯åæåã¢ã¯ã»ãµãŒãæã¡ãxã¯åTãæã¡ãyã¯Tãžã®æé»çãªå€æãæã¡ãä»£å ¥ã¯åTãæã€ã - ãã以å€ã®å Žåãå²ãåœãŠãæå¹ã§ã¯ãªãããã€ã³ãæãšã©ãŒãçºçããŸãã
åã x = y ã®ãã©ãŒã T ã®åçŽãªå²ãåœãŠã®å®è¡æåŠçã¯ã次ã®ååž°çãªæé ã§æ§æãããã xåãæã€ y ã® T ãžã®å²ãåœãŠãšããŠå®è¡ãããŸãã
-
xã¯ããŸã è©äŸ¡ãããŠããªãå Žåã«è©äŸ¡ãããŸãã -
xã倿°ãšããŠåé¡ãããŠããå Žåãyãè©äŸ¡ãããå¿ èŠã«å¿ããŠæé»çãªå€æ (T) ã䜿çšã㊠ã«å€æãããŸãã-
xã«ãã£ãŠæå®ããã倿°ã reference_typeã®é åèŠçŽ ã§ããå Žåã¯ãå®è¡æãã§ãã¯ãå®è¡ãããyã«å¯ŸããŠèšç®ãããå€ããxãèŠçŽ ã§ããé åã€ã³ã¹ã¿ã³ã¹ãšäºææ§ãããããšã確èªããŸããyãnullã§ãã å ŽåããŸãã¯æé»çãªåç §å€æ (§10.2.8) ããyã«ãã£ãŠåç §ãããã€ã³ã¹ã¿ã³ã¹ã®åãããxãå«ãé åã€ã³ã¹ã¿ã³ã¹ã®å®éã®èŠçŽ åã«ååšããå Žåããã§ãã¯ã¯æåããŸãã ãã以å€ã®å Žåã¯ãSystem.ArrayTypeMismatchExceptionãã¹ããŒãããŸãã -
yã®è©äŸ¡ãšå€æã«ãã£ãŠåŸãããå€ã¯ãxã®è©äŸ¡ã«ãã£ãŠäžããããå Žæã«æ ŒçŽãããå²ãåœãŠã®çµæãšããŠçæãããŸãã
-
-
xãããããã£ãŸãã¯ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ãšããŠåé¡ãããå Žå:-
yãè©äŸ¡ãããå¿ èŠã«å¿ããŠæé»çãªå€æ (T) ã䜿çšã㊠ã«å€æãããŸãã -
xã® set ã¢ã¯ã»ãµãŒãŸã㯠init ã¢ã¯ã»ãµãŒã¯ãyã®è©äŸ¡ãšå€æã«èµ·å ããå€ããã®å€åŒæ°ãšããŠåŒã³åºããŸãã -
yã®è©äŸ¡ãšå€æã«èµ·å ããå€ã¯ãåçŽä»£å ¥åŒã®çµæãšããŠçæãããŸãã
-
泚æ:
xã®ã³ã³ãã€ã«æã®åãdynamicã§ãyã®ã³ã³ãã€ã«æã®åããdynamicãžã®æé»çãªå€æãããå Žåãå®è¡æã®è§£æ±ºã¯å¿ èŠãããŸããã æ³šé
泚: é åã®å ±åæ£èŠå (§17.6) ã«ãããé åå
A[]ã®å€ã¯ãé ååB[]ã®ã€ã³ã¹ã¿ã³ã¹ãžã®åç §ã«ããããšãã§ããŸãããã ããBããAãžã®æé»çãªåç §å€æãååšããå Žåã«éããŸãã ãããã®èŠåã«ããã reference_type ã®é åèŠçŽ ãžã®å²ãåœãŠã«ã¯ãå²ãåœãŠãããŠããå€ãé åã€ã³ã¹ã¿ã³ã¹ãšäºææ§ãããããšã確èªããããã®å®è¡æãã§ãã¯ãå¿ èŠã§ãã ãã®äŸã§ã¯string[] sa = new string[10]; object[] oa = sa; oa[0] = null; // OK oa[1] = "Hello"; // OK oa[2] = new ArrayList(); // ArrayTypeMismatchExceptionæåŸã®ä»£å ¥ã¯ã
System.ArrayTypeMismatchExceptionãžã®åç §ããArrayListèŠçŽ ã«æ ŒçŽã§ããªãããšãåå ã§string[]ãã¹ããŒããåå ãšãªããŸããæ³šé
struct_type ã§å®£èšãããããããã£ãŸãã¯ã€ã³ãã¯ãµãŒãä»£å ¥ã®ã¿ãŒã²ããã§ããå Žåãããããã£ãŸãã¯ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã«é¢é£ä»ããããŠããã€ã³ã¹ã¿ã³ã¹åŒã¯å€æ°ãšããŠåé¡ãããŸãã ã€ã³ã¹ã¿ã³ã¹åŒãå€ãšããŠåé¡ããããšããã€ã³ãæãšã©ãŒãçºçããŸãã
泚: §12.8.7ã®ããããã£ãŒã«ãã«ãåãã«ãŒã«ãé©çšãããŸãã æ³šé
äŸ: 宣èšãæå®ããŸã:
struct Point { int x, y; public Point(int x, int y) { this.x = x; this.y = y; } public int X { get { return x; } set { x = value; } } public int Y { get { return y; } set { y = value; } } } struct Rectangle { Point a, b; public Rectangle(Point a, Point b) { this.a = a; this.b = b; } public Point A { get { return a; } set { a = value; } } public Point B { get { return b; } set { b = value; } } }ãã®äŸã§ã¯
Point p = new Point(); p.X = 100; p.Y = 100; Rectangle r = new Rectangle(); r.A = new Point(10, 10); r.B = p;
p.Xãšp.Yã¯å€æ°ã§ãããããr.Aãr.Bãpãããã³rãžã®å²ãåœãŠã¯èš±å¯ãããŸãã ãã ãããã®äŸã§ã¯Rectangle r = new Rectangle(); r.A.X = 10; r.A.Y = 10; r.B.X = 100; r.B.Y = 100;
r.Aãšr.Bã¯å€æ°ã§ã¯ãªããããä»£å ¥ã¯ãã¹ãŠç¡å¹ã§ããçµäºãµã³ãã«
12.24.3 å²ãåœãŠã®åè§£
12.24.3.1 å šè¬
deconstructing_assignment
: deconstructor '=' expression
;
deconstructor
: '(' deconstructor_element (',' deconstructor_element)+ ')'
| abridged_deconstructor
;
deconstructor_element
: deconstructor
| declaration_expression
| discard_token
| variable_reference
;
泚: abridged_deconstructor 㯠åè§£å ã®ç瞮衚èšã§ããã以äžã§èª¬æããŸã (§12.24.3.2)ã
å解代å
¥ã§ã¯ã = æŒç®å㯠å解代å
¥æŒç®åãšåŒã°ããŸãã
å ¥åãæ§æçã«èªèã§ããå Žåã« deconstructor_element ãèªèããå Žå:
- åè§£ å ãšããŠã ããã³variable_referenceãšããŠ;ãŸãã¯
- discard_tokenãšããŠããããŠvariable_referenceãšããŠ;
ãã®åŸãããããã®å Žåãåè ãéžæãããŸãã
ã¡ã¢ïŒ 代æ¿åè£ãäžèŠ§è¡šç€ºãããé åºã«åºã¥ããŠãANTLR ææ³ã»ãã³ãã£ã¯ã¹ã«ãã£ãŠãããã®åªå é äœãé©çšãããŸãã æ³šé
äžäœäºææ§ã®ããã« ãããããã®deconstructor_element ã discard_token ã§ããå Žåã¯ã次ã®ããã«ããŸãã
- "" ã®åååç
§ (
_) ã§é¢é£ä»ããããŠãã宣èšãèŠã€ãããšãdiscard_tokenã¯simple_nameãšããŠååé¡ãããæ§æçã«ã¯variable_referenceã«ãªããŸãã - ãã以å€ã®å Žåã ç Žæ£ããŒã¯ã³ ã¯åçŽãªç Žæ£ (§12.20) ã§ãã
deconstructor_elementãšããŠçºçããååé¡ãããdiscard_tokenãå«ãvariable_referenceãæžã蟌ã¿äžå¯ã®å Žåãã³ã³ãã€ã«æãšã©ãŒã«ãªããŸãã
ææ³ã§è¡šçŸãããŠããªãç¹å®ã®ã³ã³ããã¹ãã§æå¹ãª deconstructor_elementã«ã¯å¶éããããŸãã
- åçŽãªç Žæ£ (äžèšã®variable_referenceãšããŠååé¡ãããŠããªãdiscard_token) ã¯ãdeclaration_expressionã§ãvariable_referenceãšããŠãæ±ãããŸãããä»»æã®ã³ã³ããã¹ãã§deconstructor_elementãšããŠçºçããå¯èœæ§ããããä»ã®èŠçŽ ã«é©çšãããå¶éã«ã¯åœ±é¿ããŸããã
- declaration_expressionã¯ãå å«ããåè§£åãã¹ããŒãã¡ã³ãã®å é ãŸãã¯for_initializerã®ã¡ã³ããŒã«ããå Žåã«ã®ã¿çºçããŸãã
ãããã®å¶éã®å Žå:
- å¥ã® ãã³ã³ã¹ãã©ã¯ã¿ãŒã® deconstructor_elementãšããŠå ¥ãåã«ãªã£ãã ã³ã³ã¹ãã©ã¯ã¿ãŒ ã¯ãæãå€ã«ããã ã³ã³ã¹ãã©ã¯ã¿ãŒã«ãã£ãŠ "å å«" ãããŸãã
- abridged_deconstructor (§12.24.3.2) ã®ç瞮圢ã¯ãdeclaration_expressionã®ã³ã¬ã¯ã·ã§ã³ãšããŠå±éããã圢åŒãšããŠæ±ãããŸãã
- "ã¹ããŒãã¡ã³ãã®éå§æ" ãšã¯ãåè§£åãæŽŸç ã¹ããŒãã¡ã³ã â embedded_statement âexpression_statement statement_expression â statement_expression â deconstructing_assignment â åè§£åã®äžéšãšããŠèªèããã deconstructing_assignmentãçºçããå¯èœæ§ãããä»ã®å Žæã§ã¯èªèãããªãããšãæå³ããŸãããããŠ
- "for_initializerã®ã¡ã³ããŒ" ã¯ããã³ã³ã¹ãã©ã¯ã¿ãŒã掟çfor_initializer âstatement_expression_list âstatement_expressionâdeconstructing_assignmentâåè§£åã®äžéšãšããŠèªèãããdeconstructing_assignmentãçºçããå¯èœæ§ãããä»ã®å Žæã§ã¯èªèãããªãããšãæå³ããŸãã
ãã©ãŒã d = yã®åè§£å²ãåœãŠã®ã³ã³ãã€ã«æã®åŠç (d㯠arity ãæã€ãã©ãŒã (dâ, ..., dâ)ã®n) ã¯ã次ã®ããã«åŠçãããŸãã
- 代å
¥ã®å³ãªãã©ã³ã (
y) ã¯åè§£ãã (§12.7)ãeãçæãããŸãã(eâ, ..., eâ)å Žåã¯ã³ã³ãã€ã«æãšã©ãŒã§ãã - å²ãåœãŠã®å
Tãæ±ºå®ãããŸããããã§ãTã¯ã¿ãã«å(Tâ, ..., Tâ)ã§ãããåTáµ¢ã¯ã察å¿ããdáµ¢ãšeáµ¢ã«åºã¥ããŠæ¬¡ã®ããã«èšç®ãããŸãã-
dáµ¢ãç Žæ£ã§ãããeáµ¢ãåEáµ¢ãæã€å ŽåãTáµ¢ã¯Eáµ¢ã - ãã以å€ã®å Žåã
dáµ¢ã åè§£å ã®å ŽåãTáµ¢ã¯ããã®ã³ã³ãã€ã«æã¢ã«ãŽãªãºã ãååž°çã«é©çšããããšã«ãã£ãŠæ±ºå®ãããdáµ¢ = eáµ¢ã®åã«ãªããŸãã - ãã以å€ã®å Žå
dáµ¢åDáµ¢ããããeáµ¢ããDáµ¢ãžã®æé»çãªå€æãããå ŽåãTáµ¢ã¯Dáµ¢ã - ãã以å€ã®å Žåã
dáµ¢ãšeáµ¢ã¯äºææ§ããããŸãããã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
-
åè§£å²ãåœãŠã®å®è¡æåŠç (çŸåšã¯ d = e) ã¯ã次ã®ããã«åŠçãããŸãã
- æ¬¡ã®æé ã§ã¯ãå
dáµ¢ãšeáµ¢ãå·Šããå³ã« 1 åã ãè©äŸ¡ããå¿ èŠããããŸãã æ··ä¹±ãé¿ããããã«ãããã¯ãã¹ãŠã®dáµ¢ãeáµ¢ã®åã«è©äŸ¡ãããå ¥ãåã«ãªã£ã åè§£åãŸã㯠tuple_literalãååšããå Žåãé åºã¯æ·±ãåªå ã§ãã -
t圢åŒã®ã¿ãã«å€(tâ, ..., tâ)ã¯ãæé»çãªã¿ãã«å€æ (e) ã䜿çšããŠTãã«å€æããããšã«ãã£ãŠäœæãããŸãã - ç Žæ£ãããŠããªãå
dáµ¢ãå·Šããå³ã«é ã«äžŠã¹æ¿ããŸãã-
dáµ¢ã倿°åç §ã§ããå Žåã¯ãåçŽãªä»£å ¥dáµ¢ = táµ¢ãå®è¡ãããŸãã - ãã以å€ã®å Žåã
dáµ¢ã¯å ¥ãåã«ãªã£ã åè§£å ã§ããããã®æé (3) ã¯dáµ¢ãštáµ¢ã®èŠçŽ ã«ååž°çã«é©çšãããŸãã
-
-
deconstructing_assignmentåŒå
šäœã®åãšå€ã¯ããããã
Tãštã
泚: å
dáµ¢ãšeáµ¢ãå·Šããå³ã« 1 åã ãè©äŸ¡ããããšããèŠä»¶ã«ãããè©äŸ¡ã®å¯äœçšã¯ãã¹ãŠ 1 åã ãå®è¡ãããdáµ¢/eáµ¢éã®äŸåé¢ä¿ã¯ãã¹ãŠæ£ããè©äŸ¡ãããŸãã æ³šé
泚: ãã®ã¢ã«ãŽãªãºã ã«ãã£ãŠçæãããäžéã¿ãã«ã®æ§ç¯ã¯ã §8.3.11.2 ã§æå®ãããŠããå®è£ ã«ãã£ãŠçç¥ãããå ŽåããããŸãã æ³šé
äŸ: ç Žæ£ã¯ variable_referenceã§ã¯ãªããã¬ãŒã¹ãã«ããŒã§ãããããåè§£ä»£å ¥ã®å·ŠåŽã«ããæ¢åã®å€æ°ãšçµã¿åãããããšãã§ããŸãã
int x = 0; (x, _) = (1, 2); // assigns 1 to the existing variable x; the discard ignores 2 Console.WriteLine(x);çµäºãµã³ãã«
12.24.3.2 ããªããžããã³ã³ã¹ãã©ã¯ã¿ãŒ
abridged_deconstructorã¯ãæé»çã«åæå®ããã宣èšåŒãå«ãåè§£åã®ççž®æ§æã§ãã
abridged_deconstructor
: 'var' abridged_deconstructor_elements
;
abridged_deconstructor_elements
: '(' abridged_deconstructor_element (',' abridged_deconstructor_element)+ ')'
;
abridged_deconstructor_element
: identifier
| abridged_deconstructor_elements
;
abridged_deconstructorvar (e1, ..., en)ã¯åè§£åã®ç瞮圢ã§ãã(var e1, ..., var en)æšæºã® (ããªããžãããŠããªã) æ¡åŒµ (§12.24.3.1) ãšåãåäœãããŸãã ããã¯ãabridged_deconstructorå
ã®å
¥ãåã«ãªã£ã abridged_deconstructor_elementã« ååž°çã«é©çšãããŸãã ãããã£ãŠã abridged_deconstructor å
ã«å
¥ãåã«ãªã£ãåèå¥åã¯ã宣èšåŒ (§12.20) ãå°å
¥ããŸãã
äŸ: 次㮠2 ã€ã®äŸã§ã¯ãã©ã¡ãã 2 ã€ã®å€æ° a ãš b ã宣èšããŠããŸãã 1 ã€ç®ã¯ãæç€ºçã«åæå®ããã倿°ãå°å ¥ããæšæºåè§£åã䜿çšããŸãã2 ã€ç®ã¯ãåã倿°ã宣èšããæé»çã«åæå®ããabridged_deconstructorã§ãããã®å Žåã2 çªç®ã®å®æ°ã¯ã
Lãbãããããã«longãµãã£ãã¯ã¹ã«å¿ èŠã§ãã// standard deconstructor (int a, long b) = (1, 2); // a is 1, b is 2 // equivalent abridged_deconstructor var (c, d) = (1, 2L); // note the L suffix so d is inferred as longå²ãåœãŠã®åã ã®èŠçŽ ã¯ãããèªäœãåè§£åŒã«ããããšãã§ããŸãã ããšãã°ã次ã®åè§£åŒã¯ã
aãä»ããŠfã6 ã€ã®å€æ°ãå²ãåœãŠãŸããvar (a, b, (c, d, (e, f))) = (1, 2, (3, 4, (5, 6)));ãã®äŸã§ã¯ãå ¥ãåã«ãªã£ãã¿ãã«ã®æ§é ãå²ãåœãŠã®äž¡åŽã§äžèŽããå¿ èŠãããããšã«æ³šæããŠãã ããã
å·ŠåŽã®å€æ°ãæé»çã«åæå®ãããŠããå Žåã察å¿ããåŒã«ã¯æ¬¡ã®åãå¿ èŠã§ãã
(int a, string? b) = (42, null); // OK, LHS typed var (c, d) = (42, null); // Invalid as type of d cannot be inferred (int e, var f) = (42, null); // Invalid as type of f cannot be inferred var (g, h) = (10, "text"); // OK, RHS typed (var i, var j) = (10, "text"); // OK, RHS typed (var k, string l) = (42, null); // OK, for each LHS/RHS element pair one is typedçµäºãµã³ãã«
12.24.4 Ref ä»£å ¥
ref_assignment
: unary_expression '=' 'ref' expression
;
= ref æŒç®åã¯ã ref 代å
¥æŒç®åãšåŒã°ããŸãã ãã®åŒã¯ãå³ãªãã©ã³ããå·Šãªãã©ã³ãã§æå®ãããåç
§å€æ°ã®åç
§å
ã«ããŸãã
å·Šãªãã©ã³ãã¯ãåç
§å€æ° (§9.7)ãåç
§ãã©ã¡ãŒã¿ãŒ ( this以å€)ãåºåãã©ã¡ãŒã¿ãŒãå
¥åãã©ã¡ãŒã¿ãŒããŸãã¯ç Žæ£ã«ãã€ã³ãããåŒã§ãªããã°ãªããŸããã å·Šãªãã©ã³ããç Žæ£ã®å Žåãå³ãªãã©ã³ãã¯è©äŸ¡ãããŸããã倿°åç
§ã¯æ ŒçŽãããŸããã ãã以å€ã®å Žåãå³ãªãã©ã³ãã¯ãå·Šãªãã©ã³ããšåãåã®å€ãæå®ãã variable_reference (§9.5) ãçæããåŒã«ãªããŸãã
å³ãªãã©ã³ãã® ref-safe ã³ã³ããã¹ãã¯ãå°ãªããšãå·Šãªãã©ã³ãã® ref-safe ã³ã³ããã¹ããšåãå¹ ã§ãå·ŠåŽã®ãªãã©ã³ãã¯å³ãªãã©ã³ã (§9.7.2) ãšåãã»ãŒã ã³ã³ããã¹ããæã€å¿ èŠããããŸãã
泚: ãã®èŠä»¶ã¯ãref äœçœ®ã«ãã£ãŠæãããå€ã®æå¹æéãäžå€ã§ããããã«ååšããŸãã 鿥åç §ã«ãããæå¹æéãçãããå Žåã§ããããã§ã©ã®ãããªçš®é¡ã®åæ£ãèš±å¯ãããªããªããŸãã æ³šé
å³ãªãã©ã³ãã¯ãref ä»£å ¥ã®æç¹ã§ç¢ºå®ã«å²ãåœãŠãããŸãã
å·Šãªãã©ã³ããåºåãã©ã¡ãŒã¿ãŒã«ãã€ã³ãããå Žåããã®åºåãã©ã¡ãŒã¿ãŒã ref ä»£å ¥æŒç®åã®å é ã«ç¢ºå®ã«å²ãåœãŠãããŠããªãå Žåã¯ãšã©ãŒã«ãªããŸãã
å·Šãªãã©ã³ããæžã蟌ã¿å¯èœãª ref (ã€ãŸãã ref readonly ããŒã«ã«ãã©ã¡ãŒã¿ãŒãŸãã¯å
¥åãã©ã¡ãŒã¿ãŒä»¥å€ã®ãã®ãæå®ãã) ã®å Žåãå³ãªãã©ã³ãã¯æžã蟌ã¿å¯èœãª variable_referenceã«ãªããŸãã å³ãªãã©ã³ã倿°ãæžã蟌ã¿å¯èœãªå Žåãå·Šãªãã©ã³ãã¯æžã蟌ã¿å¯èœãŸãã¯èªã¿åãå°çšã® ref ã§ããå¯èœæ§ããããŸãã
ãã®æŒç®ã«ãããå·Šãªãã©ã³ããå³ãªãã©ã³ã倿°ã®å¥åã«ãªããŸãã å³ãªãã©ã³ã倿°ãæžã蟌ã¿å¯èœãªå Žåã§ãããšã€ãªã¢ã¹ãèªã¿åãå°çšã«ããããšãã§ããŸãã
ref ä»£å ¥æŒç®åã¯ãå²ãåœãŠãããåã® variable_reference ãçæããŸãã å·Šãªãã©ã³ããæžã蟌ã¿å¯èœãªå Žåã¯æžã蟌ã¿å¯èœã§ãã
ref ä»£å ¥æŒç®åã¯ãå³ãªãã©ã³ãã«ãã£ãŠåç §ãããã¹ãã¬ãŒãžã®å Žæãèªã¿åããªããã®ãšããŸãã
äŸ:
= refã®äœ¿çšäŸã次ã«ç€ºããŸããpublic static int M1() { ... } public static ref int M2() { ... } public static ref uint M2u() { ... } public static ref readonly int M3() { ... } public static void Test() { int v = 42; ref int r1 = ref v; // OK, r1 refers to v, which has value 42 r1 = ref M1(); // Error; M1 returns a value, not a reference r1 = ref M2(); // OK; makes an alias r1 = ref M2u(); // Error; lhs and rhs have different types r1 = ref M3(); // Error; M3 returns a ref readonly, which r1 cannot honor ref readonly int r2 = ref v; // OK; make readonly alias to ref r2 = ref M2(); // OK; makes an alias, adding read-only protection r2 = ref M3(); // OK; makes an alias and honors the read-only r2 = ref (r1 = ref M2()); // OK; r1 is an alias to a writable variable, // r2 is an alias (with read-only access) // to the same variable }çµäºãµã³ãã«
泚æ:
= refæŒç®åã䜿çšããŠã³ãŒããèªã¿åããšãããªãã©ã³ãã®äžéšãšããŠreféšåãèªã¿åããããªãå¯èœæ§ããããŸãã ããã¯ããªãã©ã³ããæ¡ä»¶ä»ã?:åŒã§ããå Žåã«ç¹ã«æ··ä¹±ããŸãã ããšãã°ãref int a = ref b ? ref x : ref y;ãèªã¿åãå Žåã¯ãæŒç®åã§ãã= refãb ? ref x : ref yå³ãªãã©ã³ããšããŠèªã¿åãå¿ èŠref int a = ref (b ? ref x : ref y);ã éèŠãªã®ã¯ãåŒref bãäžèŠã¹ããŒãã¡ã³ãã®äžéšãšããŠèŠããŠããå®éã«ã¯ãã®ã¹ããŒãã¡ã³ãã®äžéšã§ã¯ãªããšããããšã§ãã æ³šé
12.24.5 è€åä»£å ¥
compound_assignment
: unary_expression compound_assignment_operator expression
;
compound_assignment_operator
: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '??='
| right_shift_assignment
| unsigned_right_shift_assignment
;
compound_assignment_operatorã®æŒç®åã¯ãè€åä»£å ¥æŒç®åãšåŒã°ããŸãã
è€åä»£å ¥æŒç®åã®å·Šãªãã©ã³ãã¯ç Žæ£ã§ããŸãã (§9.2.9.2)ã
å·ŠåŽã®ãªãã©ã³ããšããŠã€ãã³ã ã¢ã¯ã»ã¹åŒãæã€ += æŒç®åãš -= æŒç®åã¯ã ã€ãã³ã代å
¥æŒç®åãšåŒã°ããŸãã å·ŠåŽã®ãªãã©ã³ããšããŠã€ãã³ã ã¢ã¯ã»ã¹ãæã€ä»ã®è€å代å
¥æŒç®åã¯æå¹ã§ã¯ãããŸããã ã€ãã³ã代å
¥æŒç®åã«ã€ããŠã¯ã §12.24.6 ãåç
§ããŠãã ããã
è€å代å
¥ã®å·Šãªãã©ã³ãã E.P 圢åŒãŸã㯠E[Eáµ¢] ã§ã E ãã³ã³ãã€ã«æã®å dynamicãæã€å Žåã代å
¥ã¯åçã«ãã€ã³ããããŸã (§12.3.3)ã ãã®å Žåã代å
¥åŒã®ã³ã³ãã€ã«æã®åã dynamicãããæ¬¡ã«ç€ºã解決ã¯å®è¡æã« Eã®åã«åºã¥ããŠå®è¡ãããŸãã å·Šãªãã©ã³ããåœ¢åŒ E[Eáµ¢] ã§ã Eáµ¢ ã®å°ãªããšã 1 ã€ã®èŠçŽ ãã³ã³ãã€ã«æå dynamicãæã¡ã E ã®ã³ã³ãã€ã«æã®åãé
åã§ãªãå Žåãçµæã®ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã¯åçã«ãã€ã³ããããŸãããã³ã³ãã€ã«æã®ãã§ãã¯ã¯å¶éãããŸã (§12.6.5)ã
åŒa ??= bã¯(T) (a ?? (a = b))ãšåãã§ãããa㯠1 åã ãè©äŸ¡ãããŸãããã ããTã¯ãaã®åãåçãªå Žåã¯bã®åã§ããããã以å€ã®å Žåã¯Ta ?? bã®åã§ãã
泚:
??(§12.18) ã®å®çŸ©ããbã¯ãaã®å€ãnullå Žåã«ã®ã¿è©äŸ¡ãããŸãã
ãã以å€ã®å Žåã x «op»= y 圢åŒã®æäœã¯ã2 é
æŒç®åã®ãªãŒããŒããŒã解決 (§12.4.5) ãé©çšããŠãæäœã x «op» yæžã蟌ãŸãããã®ããã«åŠçãããŸãã THEN
- éžæããæŒç®åã®æ»ãå€ã®åã
xã®åã«æé»çã«å€æã§ããå Žåãæäœã¯x = x «op» yãšããŠè©äŸ¡ãããŸãããã ããx㯠1 åã ãè©äŸ¡ãããŸãã - ãã以å€ã®å ŽåãéžæããæŒç®åãå®çŸ©æžã¿ã®æŒç®åã§ããå ŽåãéžæããæŒç®åã®æ»ãå€ã®åã
xã®åã«æç€ºçã«å€æå¯èœã§ãããyãxã®åã«æé»çã«å€æã§ããå ŽåããŸãã¯æŒç®åãã·ããæŒç®åã§ããå Žåãæäœã¯x = (T)(x «op» y)ãšããŠè©äŸ¡ãããŸããããã§ãTã¯xã®åã§ãã ãã ããx㯠1 åã ãè©äŸ¡ãããŸãã - ãã以å€ã®å Žåãè€åä»£å ¥ã¯ç¡å¹ã§ããããã€ã³ãæãšã©ãŒãçºçããŸãã
ãäžåºŠã ãè©äŸ¡ãããããšããçšèªã¯ã x «op» yã®è©äŸ¡ã«ãããŠã x ã®æ§æåŒã®çµæãäžæçã«ä¿åããã xãžã®å²ãåœãŠãå®è¡ãããšãã«åå©çšãããããšãæå³ããŸãã
äŸ: ä»£å ¥
A()[B()] += C()ã§ã¯ãAã¯int[]ãè¿ãã¡ãœããã§ãããBããã³Cã¯intãè¿ãã¡ãœããã§ãããã¡ãœããã¯AãBãCã®é åºã§ 1 åã ãåŒã³åºãããŸãã çµäºãµã³ãã«
è€åä»£å ¥ã®å·Šãªãã©ã³ãããããã㣠ã¢ã¯ã»ã¹ãŸãã¯ã€ã³ãã¯ãµãŒ ã¢ã¯ã»ã¹ã§ããå Žåãããããã£ãŸãã¯ã€ã³ãã¯ãµãŒã«ã¯ get ã¢ã¯ã»ãµãŒãš set ã¢ã¯ã»ãµãŒãŸã㯠init ã¢ã¯ã»ãµãŒã®äž¡æ¹ãå«ãŸããŸãã ããã§ãªãå Žåã¯ããã€ã³ãæãšã©ãŒãçºçããŸãã
äžèšã® 2 çªç®ã®èŠåã§ã¯ãç¹å®ã®ã³ã³ããã¹ãã§ x «op»= y ã x = (T)(x «op» y) ãšããŠè©äŸ¡ã§ããŸãã ãã®èŠåã¯ãå·Šãªãã©ã³ãã sbyteã byteã shortã ushortããŸã㯠charã®åã§ããå Žåã«ãå®çŸ©æžã¿ã®æŒç®åãè€åæŒç®åãšããŠäœ¿çšã§ããããã«ååšããŸãã äž¡æ¹ã®åŒæ°ããããã®åã®ããããã§ããå Žåã§ããå®çŸ©æžã¿ã®æŒç®åã¯ã intã§èª¬æãããŠããããã«ã åã®çµæãçæããŸãã ãããã£ãŠããã£ã¹ãããªããšãçµæãå·Šãªãã©ã³ãã«å²ãåœãŠãããªããªããŸãã
å®çŸ©æžã¿ã®æŒç®åã«å¯Ÿããã«ãŒã«ã®çŽæçãªå¹æã¯ã x «op»= y ãš x «op» y ã®äž¡æ¹ãèš±å¯ãããŠããå Žåã« x = y ãèš±å¯ããããšããããšã§ãã
äŸ: 次ã®ã³ãŒãäŸã®å 容:
byte b = 0; char ch = '\0'; int i = 0; b += 1; // OK b += 1000; // Error, b = 1000 not permitted b += i; // Error, b = i not permitted b += (byte)i; // OK ch += 1; // Error, ch = 1 not permitted ch += (char)1; // OKåãšã©ãŒã®çŽæçãªçç±ã¯ã察å¿ããåçŽãªå²ãåœãŠããšã©ãŒã ã£ããšããããšã§ãã
çµäºãµã³ãã«
泚: ããã¯ãè€åä»£å ¥æäœããªãããããæŒç®åããµããŒãããããšãæå³ããŸãã è€åä»£å ¥
x «op»= yã¯x = x «op» yãŸãã¯x = (T)(x «op» y)ãšããŠè©äŸ¡ããããããè©äŸ¡ã®èŠåã§ã¯ããªãããããæŒç®åãæé»çã«ã«ããŒãããŸãã æ³šé
12.24.6 ã€ãã³ãã®å²ãåœãŠ
ã€ãã³ãã®å²ãåœãŠã¯æŒç®åã®å·Šãªãã©ã³ããã€ãã³ã ã¢ã¯ã»ã¹ãšããŠåé¡ãããcompound_assignmentã®ãµãã»ããã§ãã ã€ãã³ãã®å²ãåœãŠã¯æ¬¡ã®ããã«è©äŸ¡ãããŸãã
- ã€ãã³ã ã¢ã¯ã»ã¹ã®ã€ã³ã¹ã¿ã³ã¹åŒ (ååšããå Žå) ãè©äŸ¡ãããŸãã
-
+=æŒç®åãŸãã¯-=æŒç®åã®å³ãªãã©ã³ããè©äŸ¡ãããå¿ èŠã«å¿ããŠãæé»çãªå€æ (§10.2) ã䜿çšããŠå·Šãªãã©ã³ãã®åã«å€æãããŸãã - åã®æé ã§èšç®ããå€ã§æ§æãããåŒæ°ãªã¹ãã䜿çšããŠãã€ãã³ãã®ã€ãã³ã ã¢ã¯ã»ãµãŒãåŒã³åºãããŸãã æŒç®åã
+=ãããå Žåã¯ãadd ã¢ã¯ã»ãµãŒãåŒã³åºãããŸããæŒç®åã-=ãããå Žåã¯ãremove ã¢ã¯ã»ãµãŒãåŒã³åºãããŸãã
ã€ãã³ãå²ãåœãŠåŒã¯å€ãçæããŸããã ãããã£ãŠãã€ãã³ãå²ãåœãŠåŒã¯ã statement_expression (§13.7) ã®ã³ã³ããã¹ãã§ã®ã¿æå¹ã§ãã
12.25 åŒ
åŒã¯ãnon_assignment_expression ãŸã㯠assignment ã®ããããã§ãã
expression
: non_assignment_expression
| assignment
;
non_assignment_expression
: conditional_expression
| lambda_expression
| query_expression
;
12.26 宿°åŒ
宿°åŒã¯ãã³ã³ãã€ã«æã«å®å šã«è©äŸ¡ãããåŒã§ãã
constant_expression
: conditional_expression
;
宿°åŒã¯ã nullå€ãæã£ãŠããããå€åãŸãã¯åç
§åã§ããå¿
èŠããããŸãã 宿°åŒã«å€åãããå Žåããã®åã¯ã sbyteã byteã shortã ushortã intã uintã nintã nuintã longã ulongã charã floatã doubleã decimalã bool, ããŸãã¯ä»»æã®åæåã®ããããã«ãªããŸãã 宿°åŒã«åç
§åãããå ŽåãåŒã¯æ¬¡ã®æ¡ä»¶ãæã€å¿
èŠããããŸãã
-
stringåã®å€ãæã€ã - ã¯ãåç §åã®æ¢å®å€ã®åŒ (§12.8.21) ã§ãã
åã®nintã¯ã[-2147483648, 2147483647] ã®ç¯å²å
ã®å€ãæã€å¿
èŠããããŸãã
åã®nuintã¯ã[0, 4294967295] ã®ç¯å²ã®å€ãæã€å¿
èŠããããŸãã
宿°åŒã§ã¯ã次ã®ã³ã³ã¹ãã©ã¯ãã®ã¿ãèš±å¯ãããŸãã
- ãªãã©ã« (
nullãªãã©ã«ãå«ã¿ãŸãããUTF-8 æååãªãã©ã«ã¯é€ããŸã)ã - 宿°è£éæååã
- ã¯ã©ã¹ãæ§é äœãããã³ã€ã³ã¿ãŒãã§ã€ã¹åã®
constã¡ã³ããŒãžã®åç §ã - åæåã®ã¡ã³ããŒãžã®åç §ã
- ããŒã«ã«å®æ°ãžã®åç §ã
- æ¬åŒ§ã§æ¬ãããéšååŒãããèªäœã宿°åŒã§ãã
- ãã£ã¹ãåŒã
-
checkedããã³uncheckedåŒã -
nameofåŒã - å®çŸ©æžã¿ã®
+ã-ã!(è«çåŠå®)ãããã³åé æŒç®å~ã - å®çŸ©æžã¿ã®
+ã-ã*ã/ã%ã<<ã>>ã>>>ã&ã|ã^ã&&ã||ã==ã!=ã<ã>ã<=ãããã³>=äºé æŒç®åã -
?:æ¡ä»¶æŒç®åã -
!null-forgiving æŒç®å (§12.8.9)ã -
sizeofã¢ã³ãããŒãžåã §24.6.9 ã§æå®ãããåã® 1 ã€ã§ãããsizeofã宿°å€ãè¿ãå Žåã¯ãåŒã - åãäžèšã®ããããã§ããå Žåã®ããã©ã«ãå€åŒã
宿°åŒã§ã¯ã次ã®å€æã䜿çšã§ããŸãã
- ID 倿
- æ°å€å€æ
- åæã®å€æ
- 宿°åŒã®å€æ
- 倿ã®ãœãŒã¹ã
nullå€ã«è©äŸ¡ããã宿°åŒã§ããå Žåã«ãããŠãæé»çããã³æç€ºçãªåç §å€æãè¡ãããŸãã
泚:
null以å€ã®å€ã®ããã¯ã¹åãããã¯ã¹åè§£é€ãæé»çãªåç §å€æãªã©ã®ãã®ä»ã®å€æã¯ã宿°åŒã§ã¯äœ¿çšã§ããŸããã æ³šé
äŸ: 次ã®ã³ãŒãäŸã®å 容:
class C { const object i = 5; // error: boxing conversion not permitted const object str = "hello"; // error: implicit reference conversion }ããã¯ã¹å倿ãå¿ èŠã§ããããã
iã®åæåã¯ãšã©ãŒã§ããstrã®åæåã¯ãnull以å€ã®å€ããã®æé»çãªåç §å€æãå¿ èŠã§ããããããšã©ãŒã§ããçµäºãµã³ãã«
åŒãäžèšã®èŠä»¶ãæºãããã³ã«ãåŒã¯ã³ã³ãã€ã«æã«è©äŸ¡ãããŸãã ããã¯ãåŒãé宿°ã³ã³ã¹ãã©ã¯ããå«ã倧ããªåŒã®éšååŒã§ããå Žåã§ãåœãŠã¯ãŸããŸãã
宿°åŒã®ã³ã³ãã€ã«æè©äŸ¡ã§ã¯ãé宿°åŒã®å®è¡æè©äŸ¡ãšåãèŠåã䜿çšãããŸãããã ããå®è¡æã®è©äŸ¡ã§äŸå€ãã¹ããŒãããå Žåãã³ã³ãã€ã«æã®è©äŸ¡ã«ãã£ãŠã³ã³ãã€ã«æãšã©ãŒãçºçããç¹ãç°ãªããŸãã
constant_expressionã®ã³ã³ãã€ã«æã®è©äŸ¡ã§ã¯ã次ã®å€ã䜿çšããŸãã
-
nintåã®ãã¹ãŠã®å€ãSystem.Int32ãšããŠæ±ããŸãã -
nuintåã®ãã¹ãŠã®å€ãSystem.UInt32ãšããŠæ±ããŸãã - ãã以å€ã®å Žåã¯ãå®è¡æã®é宿°åŒãšåãè©äŸ¡èŠåã䜿çšããŸãã
nint
/
nuintå€ãInt32/UInt32ãšããŠè¡šçŸã§ããªãå ŽåããŸãã¯åŒå
šäœã®å®è¡æè©äŸ¡ã§äŸå€ãã¹ããŒãããå Žåã¯ãã³ã³ãã€ã«æãšã©ãŒãçæãããŸãã
äŸ: ãããã®èŠåã¯ãconstant_expressionãšããŠè¡šé¢çã«æå¹ãªãã€ãã£ãæŽæ°ãå«ãåŒã¯ãå®è£ ã§å®çŸ©ãããå®å šãªãã€ãã£ãæŽæ°ç²ŸåºŠã䜿çšããŠå®è¡æã«è©äŸ¡ãããåŒãšããŠã®ã¿æå¹ã§ããããšãæå³ããŸãã
public class C { private const nint hugeNumber = int.MaxValue + 1; }åã®äŸã§ã¯ãåŒ
int.MaxValue + 1ã®çµæãInt32ãšããŠè¡šçŸã§ããªãããããšã©ãŒãçæãããŸããnintã®ãµã€ãºã 32 ããããè¶ ãããã·ã³ã§ã¯ãåŒã¯å®è¡æã«æåããŸãã çµäºãµã³ãã«
宿°åŒã unchecked ã³ã³ããã¹ãã«æç€ºçã«é
眮ãããŠããªãéããåŒã®ã³ã³ãã€ã«æã®è©äŸ¡äžã«æŽæ°åã®ç®è¡æŒç®ããã³å€æã§çºçãããªãŒããŒãããŒã¯ãåžžã«ã³ã³ãã€ã«æãšã©ãŒãåŒãèµ·ãããŸã (§12.8.20)ã
宿°åŒã¯ã以äžã«ç€ºãã³ã³ããã¹ãã§å¿ èŠã§ããããã¯ã constant_expressionã䜿çšããŠææ³ã§ç€ºãããŸãã ãããã®ã³ã³ããã¹ãã§ã¯ãã³ã³ãã€ã«æã«åŒãå®å šã«è©äŸ¡ã§ããªãå Žåãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
- 宿°å®£èš (§15.4)
- åæã¡ã³ããŒå®£èš (§20.4)
- ãã©ã¡ãŒã¿ãŒ ãªã¹ãã®æ¢å®ã®åŒæ° (§15.6.2)
-
caseã¹ããŒãã¡ã³ãã®switchã©ãã« (§13.8.3)ã -
goto caseã¹ããŒãã¡ã³ã (§13.10.4) - åæååãå«ãé åäœæåŒ (§12.8.17.4) ã®æ¬¡å ã®é·ãã
- 屿§ (§23)
- constant_pattern (§11.2.3) å
æé»çãªå®æ°åŒå€æ (§10.2.11) ã§ã¯ã宿°åŒã®å€ã倿å
ã®åã®ç¯å²å
ã«ããå Žåãå int ã®å®æ°åŒã sbyteã byteã shortã ushortã uintã nintã nuintããŸã㯠ulongã«å€æã§ããŸãã
12.27 ããŒã«åŒ
boolean_expression ã¯ãboolåã®çµæãçæããåŒã§ããç¹å®ã®ã³ã³ããã¹ãã§ã¯æ¬¡ã«ç€ºãããã« operator true ãé©çšããããšã§ããããã¯çŽæ¥çã«çµæãåŸãããšãã§ããŸãã
boolean_expression
: expression
;
if_statement (§13.8.2)ãwhile_statement (§13.9.2)ãdo_statement (§13.9.3)ããŸã㯠for_statement (§13.9.4) ã®å¶åŸ¡æ¡ä»¶åŒã¯ boolean_expressionã§ãã
?:æŒç®å (§12.21) ã®å¶åŸ¡æ¡ä»¶åŒã¯ãboolean_expressionãšåãèŠåã«åŸããŸãããæŒç®åã®åªå
é äœã®çç±ãããnull_coalescing_expressionãšããŠåé¡ãããŸãã
boolean_expressionE ã¯ã次ã®ããã«ã boolåã®å€ãçæã§ããå¿
èŠããããŸãã
- E ã
boolã«æé»çã«å€æã§ããå Žåã¯ãå®è¡æã«æé»çãªå€æãé©çšãããŸãã - ãã以å€ã®å Žåã¯ãåé
æŒç®åã®ãªãŒããŒããŒã解決 (§12.4.4) ã䜿çšããŠã
operator trueã§ã®Eã®åºæã®æé©ãªå®è£ ãèŠã€ããå®è¡æã«ãã®å®è£ ãé©çšãããŸãã - ãã®ãããªæŒç®åãèŠã€ãããªãå Žåã¯ããã€ã³ãæãšã©ãŒãçºçããŸãã
ECMA C# draft specification