Note
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãµã€ã³ã€ã³ãŸãã¯ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
9.1 å šè¬
倿°ã¯ãã¹ãã¬ãŒãžã®å Žæã衚ããŸãã å倿°ã«ã¯åãããããã®åã«ãã£ãŠå€æ°ã«æ ŒçŽã§ããå€ã決ãŸããŸãã C# ã¯ã¿ã€ãã»ãŒããªèšèªã§ãããC# ã³ã³ãã€ã©ã§ã¯ã倿°ã«æ ŒçŽãããŠããå€ãåžžã«é©åãªåã§ããããšãä¿èšŒãããŸãã 倿°ã®å€ã¯ã代å
¥ãŸã㯠++ æŒç®åãš -- æŒç®åã䜿çšããŠå€æŽã§ããŸãã
倿°ã®å€ãååŸããåã«ã確å®ä»£å ¥ãã (§9.4) å¿ èŠããããŸãã
次ã®ãµãã¯ã©ã¹ã§èª¬æãããŠããããã«ã倿°ã¯åæã«ä»£å ¥ããããåæã«ä»£å ¥ãè§£é€ãããŸãã æåã«ä»£å ¥ããã倿°ã«ã¯ãé©åã«å®çŸ©ãããåæå€ããããåžžã«ç¢ºå®ä»£å ¥ãšã¿ãªãããŸãã åæã«ä»£å ¥ãããŠããªã倿°ã«ã¯ãåæå€ã¯ãããŸããã ç¹å®ã®å Žæã§ç¢ºå®ä»£å ¥ãšã¿ãªãããåæã«ä»£å ¥è§£é€ããã倿°ã®å Žåããã®å Žæã«å°ãå®è¡ãã¹ããšã«å€æ°ãžã®ä»£å ¥ãè¡ãããŸãã
9.2 倿°ã®ã«ããŽãª
9.2.1 å šè¬
C# ã§ã¯ãéç倿°ãã€ã³ã¹ã¿ã³ã¹å€æ°ãé åèŠçŽ ãå€ãã©ã¡ãŒã¿ãŒãå ¥åãã©ã¡ãŒã¿ãŒãåç §ãã©ã¡ãŒã¿ãŒãåºåãã©ã¡ãŒã¿ãŒãããŒã«ã«å€æ°ã® 8 ã€ã®ã«ããŽãªãå®çŸ©ãããŠããŸãã 以åŸã®ãµãå¥ã§ã¯ããããã®åã«ããŽãªã«ã€ããŠèª¬æããŸãã
äŸ: 次ã®ã³ãŒãäŸã®å 容:
class A { public static int x; int y; void F(int[] v, int a, ref int b, out int c, in int d) { int i = 1; c = a + b++ + d; } }
xã¯éç倿°ãyã¯ã€ã³ã¹ã¿ã³ã¹å€æ°ãv[0]ã¯é åèŠçŽ ãaã¯å€ãã©ã¡ãŒã¿ãŒãbã¯åç §ãã©ã¡ãŒã¿ãŒãcã¯åºåãã©ã¡ãŒã¿ãŒãdã¯å ¥åãã©ã¡ãŒã¿ãŒãiã¯ããŒã«ã«å€æ°ã§ãã çµäºãµã³ãã«
9.2.2 éç倿°
static 修食åã§å®£èšããããã£ãŒã«ãã¯éç倿°ã§ãã éç倿°ã¯ããã®åãå«ã static ã³ã³ã¹ãã©ã¯ã¿ãŒ (§15.12) ãå®è¡ãããåã«ååšããé¢é£ä»ããããŠããã¢ããªã±ãŒã·ã§ã³ ãã¡ã€ã³ãååšããªããªããšååšããªããªããŸãã
éç倿°ã®åæå€ã¯ã倿°ã®åã®æ¢å®å€ (§9.3) ã§ãã
確å®ä»£å ¥ã®ç¢ºèªãããå Žåãéç倿°ã¯ãåæã«ä»£å ¥ããããã®ãšã¿ãªãããŸãã
9.2.3 ã€ã³ã¹ã¿ã³ã¹å€æ°
9.2.3.1 å šè¬
static 修食åãªãã§å®£èšããããã£ãŒã«ãã¯ãã€ã³ã¹ã¿ã³ã¹å€æ°ã§ãã
9.2.3.2 ã¯ã©ã¹å ã®ã€ã³ã¹ã¿ã³ã¹å€æ°
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹å€æ°ã¯ããã®ã¯ã©ã¹ã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããããšãã«ååšãããã®ã€ã³ã¹ã¿ã³ã¹ãžã®åç §ããªããã€ã³ã¹ã¿ã³ã¹ã®ãã¡ã€ãã©ã€ã¶ãŒ (ååšããå Žå) ãå®è¡ããããšååšããªããªããŸãã
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹å€æ°ã®åæå€ã¯ã倿°ã®åã®æ¢å®å€ (§9.3) ã§ãã
確å®ä»£å ¥ã確èªããå Žåãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹å€æ°ã¯ãåæã«ä»£å ¥ããããã®ãšããŠã¿ãªãããŸãã
9.2.3.3 æ§é äœå ã®ã€ã³ã¹ã¿ã³ã¹å€æ°
æ§é äœã®ã€ã³ã¹ã¿ã³ã¹å€æ°ã®æå¹æéã¯ãæ§é äœãå±ããæ§é äœå€æ°ãšãŸã£ããåãã§ãã èšãæãããšãæ§é äœåã®å€æ°ãååšãããæ¶æ» ããããããšãããã«äŒŽããã®æ§é äœã®ã€ã³ã¹ã¿ã³ã¹å€æ°ãååšãããæ¶æ» ãããããŸãã
æ§é äœã®ã€ã³ã¹ã¿ã³ã¹å€æ°ã®åæä»£å
¥ç¶æ
ã¯ãstruct 倿°ãå«ãŸããã€ã³ã¹ã¿ã³ã¹å€æ°ã®åæä»£å
¥ç¶æ
ãšåãã§ãã èšãæãããšãæ§é äœå€æ°ãåæä»£å
¥ãšèŠãªããããšãã€ã³ã¹ã¿ã³ã¹å€æ°ãåæä»£å
¥ããããšèŠãªãããæ§é äœå€æ°ãåæä»£å
¥è§£é€ããããšãã€ã³ã¹ã¿ã³ã¹å€æ°ãåæ§ã«åæä»£å
¥è§£é€ããããšã¿ãªãããŸãã
9.2.4 é åã®èŠçŽ
é åã€ã³ã¹ã¿ã³ã¹ãäœæããããšé åã®èŠçŽ ãååšãããã®é åã€ã³ã¹ã¿ã³ã¹ãžã®åç §ãç¡ããªããšååšããªããªããŸãã
é åã®åèŠçŽ ã®åæå€ã¯ããã®é åèŠçŽ ã®åã®æ¢å®å€ (§9.3) ã§ãã
確å®ä»£å ¥ã確èªããå Žåãé åèŠçŽ ã¯ãåæä»£å ¥ããããšã¿ãªãããŸãã
9.2.5 å€ãã©ã¡ãŒã¿ãŒ
å€ãã©ã¡ãŒã¿ãŒã¯ããã©ã¡ãŒã¿ãŒãå±ãã颿°ã¡ã³ã㌠(ã¡ãœãããã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒãã¢ã¯ã»ãµãŒããŸãã¯æŒç®å) ãŸãã¯å¿å颿°ã®åŒã³åºãæã«ååšããåŒã³åºãã§æå®ãããåŒæ°ã®å€ã§åæåãããŸãã éåžžãå€ãã©ã¡ãŒã¿ãŒã¯é¢æ°æ¬äœã®å®è¡ãå®äºãããšãååšããªããªããŸãã ãã ããå€ãã©ã¡ãŒã¿ãŒãéstatic å¿å颿° (§12.22.6.2) ã«ãã£ãŠãã£ããã£ãããå Žåããã®å¿å颿°ããäœæãããããªã²ãŒããŸãã¯åŒããªãŒãã¬ããŒãž ã³ã¬ã¯ã·ã§ã³ã®å¯Ÿè±¡ã«ãªããŸã§ããã®æå¹æéã¯å°ãªããšãæ¡åŒµãããŸãã
確å®ä»£å ¥ã確èªããå Žåãå€ãã©ã¡ãŒã¿ãŒã¯ãåæä»£å ¥ããããšã¿ãªãããŸãã
å€ãã©ã¡ãŒã¿ãŒã«ã€ããŠã¯ã§15.6.2.2 ã§è©³è¿°ããŸãã
9.2.6 åç §ãã©ã¡ãŒã¿ãŒ
åç §ãã©ã¡ãŒã¿ãŒã¯ã颿°ã¡ã³ããŒãããªã²ãŒããå¿å颿°ããŸãã¯ããŒã«ã«é¢æ°ã®åŒã³åºãæã«ååšããåç §å€æ° (§9.7) ã§ããããã®ãªãã¡ã¬ã³ãã¯ãã®åŒã³åºãã®åŒæ°ãšããŠæå®ããã倿°ã«åæåãããŸãã éåžžãåç §ãã©ã¡ãŒã¿ãŒã¯é¢æ°æ¬äœã®å®è¡ãå®äºãããšãååšããªããªããŸãã å€ãã©ã¡ãŒã¿ãŒãšã¯ç°ãªããåç §ãã©ã¡ãŒã¿ãŒã¯ãã£ããã£ãããŸãã (§9.7.2.9)ã
åç §ãã©ã¡ãŒã¿ãŒã«ã¯ã次ã®ç¢ºå®ä»£å ¥ã«ãŒã«ãé©çšãããŸãã
泚: åºåãã©ã¡ãŒã¿ãŒã®ã«ãŒã«ã¯ç°ãªããŸãã(§9.2.7) ã§èª¬æãããŠããŸãã æ³šé
- 倿°ã¯ã颿°ã¡ã³ããŒãŸãã¯ããªã²ãŒãåŒã³åºãã§åç §ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããåã«ã確å®ä»£å ¥ãããŸã (§9.4)ã
- 颿°ã¡ã³ããŒãŸãã¯å¿å颿°å ã§ã¯ãåç §ãã©ã¡ãŒã¿ãŒã¯åæä»£å ¥ããããã®ãšã¿ãªãããŸãã
åç §ãã©ã¡ãŒã¿ãŒã«ã€ããŠã¯ã§15.6.2.3.3 ã§è©³è¿°ããŸãã
9.2.7 åºåãã©ã¡ãŒã¿ãŒ
åºåãã©ã¡ãŒã¿ãŒã¯ã颿°ã¡ã³ããŒãããªã²ãŒããå¿å颿°ããŸãã¯ããŒã«ã«é¢æ°ã®åŒã³åºãæã«ååšããåç §å€æ° (§9.7) ã§ããããã®ãªãã¡ã¬ã³ãã¯ãã®åŒã³åºãã®åŒæ°ãšããŠæå®ããã倿°ã«åæåãããŸãã 颿°æ¬äœã®å®è¡ãå®äºãããšãåºåãã©ã¡ãŒã¿ãŒã¯ååšããªããªããŸãã å€ãã©ã¡ãŒã¿ãŒãšã¯ç°ãªããåºåãã©ã¡ãŒã¿ãŒã¯ãã£ããã£ãããŸãã (§9.7.2.9)ã
åºåãã©ã¡ãŒã¿ãŒã«ã¯ã次ã®ç¢ºå®ä»£å ¥ã«ãŒã«ãé©çšãããŸãã
泚: åç §ãã©ã¡ãŒã¿ãŒã®ã«ãŒã«ã¯ç°ãªããŸãã(§9.2.7) ã§èª¬æãããŠããŸãã æ³šé
- 颿°ã¡ã³ããŒãŸãã¯ããªã²ãŒãåŒã³åºãã§åºåãã©ã¡ãŒã¿ãŒãšããŠæž¡ãåã«ã倿°ã確å®ä»£å ¥ããå¿ èŠã¯ãããŸããã
- 颿°ã¡ã³ããŒãŸãã¯ããªã²ãŒãã®åŒã³åºããæ£åžžã«å®äºããåŸãåºåãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããå倿°ã¯ããã®å®è¡ãã¹ä»£å ¥ããããšã¿ãªãããŸãã
- 颿°ã¡ã³ããŒãŸãã¯å¿å颿°å ã§ã¯ãåºåãã©ã¡ãŒã¿ãŒã¯åæä»£å ¥è§£é€ããããã®ãšã¿ãªãããŸãã
- 颿°ã¡ã³ããŒãå¿å颿°ããŸãã¯ããŒã«ã«é¢æ°ã®ååºåãã©ã¡ãŒã¿ãŒã¯ã颿°ã¡ã³ããŒãå¿å颿°ããŸãã¯ããŒã«ã«é¢æ°ãæ£åžžã«æ»ãåã«ã確å®ä»£å ¥ãããŸã (§9.4)ã
åºåãã©ã¡ãŒã¿ãŒã«ã€ããŠã¯ã§15.6.2.3.4 ã§è©³è¿°ããŸãã
9.2.8 å ¥åãã©ã¡ãŒã¿ãŒ
å ¥åãã©ã¡ãŒã¿ãŒã¯ã颿°ã¡ã³ããŒãããªã²ãŒããå¿å颿°ããŸãã¯ããŒã«ã«é¢æ°ã®åŒã³åºãæã«ååšããåç §å€æ° (§9.7) ã§ããããã®ãªãã¡ã¬ã³ãã¯ãã®åŒã³åºãã®åŒæ°ãšããŠæå®ããã variable_reference ã«åæåãããŸãã 颿°æ¬äœã®å®è¡ãå®äºãããšãå ¥åãã©ã¡ãŒã¿ãŒã¯ååšããªããªããŸãã å€ãã©ã¡ãŒã¿ãŒãšã¯ç°ãªããå ¥åãã©ã¡ãŒã¿ãŒã¯ãã£ããã£ãããŸãã (§9.7.2.9)ã
å ¥åãã©ã¡ãŒã¿ãŒã«ã¯ã次ã®ç¢ºå®ä»£å ¥ã«ãŒã«ãé©çšãããŸãã
- 倿°ã¯ã颿°ã¡ã³ããŒãŸãã¯ããªã²ãŒãåŒã³åºãã§å ¥åãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããåã«ã確å®ä»£å ¥ãããŸã (§9.4)ã
- 颿°ã¡ã³ããŒãå¿å颿°ããŸãã¯ããŒã«ã«é¢æ°å ã§ã¯ãå ¥åãã©ã¡ãŒã¿ãŒã¯åæä»£å ¥ããããšã¿ãªãããŸãã
å ¥åãã©ã¡ãŒã¿ãŒã«ã€ããŠã¯ã§15.6.2.3.4 ã§è©³è¿°ããŸãã
9.2.9 ããŒã«ã«å€æ°
9.2.9.1 å šè¬
ããŒã«ã«å€æ°ã¯ãtry_statement ã® local_variable_declarationãdeclaration_expressionãforeach_statement ãŸã㯠specific_catch_clause ã§å®£èšãããŸãã ããŒã«ã«å€æ°ã¯ãç¹å®ã®çš®é¡ã® pattern (§11) ã§å®£èšããããšãã§ããŸãã foreach_statementã®å ŽåãããŒã«ã«å€æ°ã¯ååŸ©å€æ°ã§ã (§13.9.5)ã specific_catch_clauseã®å ŽåãããŒã«ã«å€æ°ã¯äŸå€å€æ° (§13.11) ã§ãã foreach_statement ãŸã㯠specific_catch_clause ã宣èšããããŒã«ã«å€æ°ã¯ãåæä»£å ¥ããããšã¿ãªãããŸãã
local_variable_declarationã¯ããããã¯ãfor_statementãswitch_blockããŸãã¯using_statement ã§çºçã§ããŸãã
declaration_expressionã¯ãoutargument_valueãããã³åè§£å²ãåœãŠã®ã¿ãŒã²ããã§ããtuple_elementãšããŠçºçããå¯èœæ§ããããŸã (§12.24.2)ã
ããŒã«ã«å€æ°ã®æå¹æéãšã¯ãã¹ãã¬ãŒãžãäºçŽãããããšãä¿èšŒãããŠããããã°ã©ã å®è¡ã®äžéšã§ãã ãã®æå¹æéã¯ãé¢é£ä»ããããŠããã¹ã³ãŒããžã®ãšã³ããªããå°ãªããšããã®ã¹ã³ãŒãã®ããã°ã©ã å®è¡ãäœããã®æ¹æ³ã§çµäºãããŸã§å»¶é·ãããŸãã (å²ãŸãã ãããã¯ã®å
¥åãã¡ãœããã®åŒã³åºããå埩åãããã¯ããã®å€ã®çæã¯ãçŸåšã®ã¹ã³ãŒãã®å®è¡ãäžæããŸãããçµäºããŸãã)ãããŒã«ã«å€æ°ãéstatic å¿å颿° (§12.22.6.2) ã«ãã£ãŠãã£ããã£ãããå Žåããã®æå¹æéã¯ãå°ãªããšãå¿å颿°ããäœæãããããªã²ãŒããŸãã¯åŒããªãŒãšããã£ããã£ããã倿°ãåç
§ããä»ã®ãªããžã§ã¯ããã¬ããŒãž ã³ã¬ã¯ã·ã§ã³ã®å¯Ÿè±¡ã«ãªããŸã§æ¡åŒµãããŸãã 芪ã¹ã³ãŒããååž°çãŸãã¯å埩çã«å
¥ãå ŽåãããŒã«ã«å€æ°ã®æ°ããã€ã³ã¹ã¿ã³ã¹ãæ¯åäœæããããã®åæåå (ååšããå Žå) ãæ¯åè©äŸ¡ãããŸãã
泚: ããŒã«ã«å€æ°ã¯ãã¹ã³ãŒããå ¥åããããã³ã«ã€ã³ã¹ã¿ã³ã¹åãããŸãã ãã®åäœã¯ãå¿åã¡ãœãããå«ããŠãŒã¶ãŒ ã³ãŒãã«è¡šç€ºãããŸãã æ³šé
泚: foreach_statement ã宣èšããã€ãã¬ãŒã·ã§ã³å€æ° (§13.9.5) ã®æå¹æéã¯ãã¹ããŒãã¡ã³ãã® 1 åã®ã€ãã¬ãŒã·ã§ã³ã§ãã ã€ãã¬ãŒã·ã§ã³ããšã«æ°ãã倿°ãäœæãããŸãã æ³šé
泚: ããŒã«ã«å€æ°ã®å®éã®æå¹æéã¯å®è£ ã«äŸåããŸãã ããšãã°ãã³ã³ãã€ã©ã¯ããããã¯å ã®ããŒã«ã«å€æ°ããã®ãããã¯ã®ããäžéšã«ã®ã¿äœ¿çšãããããšãéçã«å€æããå ŽåããããŸãã ãã®åæã䜿çšãããšãã³ã³ãã€ã©ã«ãã£ãŠã³ãŒããçæããããã®çµæã倿°ã®ã¹ãã¬ãŒãžã®æå¹æéããå å«ãããã¯ãããçããªããŸãã
ããŒã«ã«åç §å€æ°ã«ãã£ãŠåç §ãããã¹ãã¬ãŒãžã¯ããã®ããŒã«ã«åç §å€æ° (§7.8) ã®æå¹æéãšã¯ç¡é¢ä¿ã«åå©çšãããŸãã
泚é
local_variable_declaration ãŸã㯠declaration_expression ã«ãã£ãŠå°å ¥ãããããŒã«ã«å€æ°ã¯èªåçã«åæåãããªããããæ¢å®å€ã¯ãããŸããã ãã®ãããªããŒã«ã«å€æ°ã¯ãåæä»£å ¥è§£é€ããããã®ã¿ãªãããŸãã
泚: åæååãå«ã local_variable_declaration ã¯ããŸã åæä»£å ¥è§£é€ãããŠããŸããã 宣èšã®åŸè·¯ã°ã©ã å®è¡ã¯ã倿°ãžã®ä»£å ¥ãšãŸã£ããåãããã«åäœããŸã (§9.4.4.5)ã ããšãã°åæåååŒèªäœãåæååããã€ãã¹ãã goto_statement å ã§åæååãå®è¡ãããåã«å€æ°ã䜿çšãããšã³ã³ãã€ã«æã®ãšã©ãŒãšãªããŸãã
goto L; int x = 1; // never executed L: x += 1; // error: x not definitely assignedããŒã«ã«å€æ°ã®ã¹ã³ãŒãå ã§ã¯ã宣èšåã®åã®ããã¹ãäœçœ®ã§ãã®ããŒã«ã«å€æ°ãåç §ããã®ã¯ã³ã³ãã€ã«æãšã©ãŒã§ãã
泚é
9.2.9.2 ç Žæ£
ç Žæ£ã¯ãååã®ãªã倿°ã§ãã ç Žæ£ã¯ãèå¥åãæã€å®£èšåŒ (_) ã«ãã£ãŠå°å
¥ãããæé»çã«åæå® (_ãŸãã¯var _) ãŸãã¯æç€ºçã«åæå® (T _) ãããŸãã ç Žæ£ã¯ãå¿å颿° (§12.22.2) ã®ãã©ã¡ãŒã¿ãŒãšããŠå°å
¥ããããšãã§ããŸãã
泚:
_ã¯ãå€ãã®åœ¢åŒã®å®£èšã§æå¹ãªèå¥åã§ãã æ³šé
ç Žæ£ã«ã¯ååããªããããããã衚ã倿°ãžã®å¯äžã®åç §ã¯ããããå°å ¥ããåŒã§ãã
泚: ãã ããç Žæ£ã¯åºååŒæ°ãšããŠæž¡ãããšãã§ããŸããããã«ããã察å¿ããåºåãã©ã¡ãŒã¿ãŒã¯ãé¢é£ä»ããããŠããã¹ãã¬ãŒãžã®å Žæã瀺ãããšãã§ããŸãã æ³šé
宣èšåŒã«ãã£ãŠå°å ¥ãããç Žæ£ã¯æåã¯å²ãåœãŠãããªãããããã®å€ã«ã¢ã¯ã»ã¹ããã®ã¯åžžã«ãšã©ãŒã§ãã
äŸ:
_ = "Hello".Length; (int, int, int) M(out int i1, out int i2, out int i3) { ... } (int _, var _, _) = M(out int _, out var _, out _);ãã®äŸã§ã¯ãã¹ã³ãŒãå ã«åå
_宣èšããªãããšãåæãšããŠããŸãã
_ãžã®ä»£å ¥ã¯ãåŒã®çµæãç¡èŠããããã®åçŽãªãã¿ãŒã³ã瀺ããŠããŸããMã®åŒã³åºãã¯ãã¿ãã«ãšåºåãã©ã¡ãŒã¿ãŒã§äœ¿çšã§ããç Žæ£ã®ããŸããŸãªåœ¢åŒã瀺ããŠããŸããçµäºãµã³ãã«
9.3 æ¢å®å€
次ã®ã«ããŽãªã®å€æ°ã¯ãæ¢å®å€ã«èªåçã«åæåãããŸãã
- éç倿°
- ã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ãšæ§é äœã€ã³ã¹ã¿ã³ã¹ã®ã€ã³ã¹ã¿ã³ã¹å€æ°ã
- é åã®èŠçŽ ã
倿°ã®æ¢å®å€ã¯å€æ°ã®åã«ãã£ãŠç°ãªããæ¬¡ã®ããã«æ±ºå®ãããŸãã
- value_type ã®å€æ°ã®å Žåãæ¢å®å€ã¯ãvalue_typeã®æ¢å®ã®ã³ã³ã¹ãã©ã¯ã¿ãŒ (§8.3.3) ãèšç®ããå€ãšåãã§ãã
-
reference_typeãŸãã¯åç
§å€æ°ã®å€æ°ã®å Žåãæ¢å®å€ã¯
nullã
泚: æ¢å®å€ãžã®åæåã¯ãéåžžã䜿çšããããã«å²ãåœãŠãããåã«ã¡ã¢ãª ãããŒãžã£ãŒãŸãã¯ã¬ããŒãž ã³ã¬ã¯ã¿ãŒãã¡ã¢ãªã all-bits-zero ã«åæåããããšã«ãã£ãŠè¡ãããŸãã ãã®ãããall-bits-zero ã䜿çšã㊠null åç §ã衚ããšäŸ¿å©ã§ãã æ³šé
泚: ref 倿°ã«åç §å ãå²ãåœãŠãããŠãããã©ããããã¹ãããã«ã¯ã
System.Runtime.CompilerServices.Unsafe.IsNullRef(ref fieldName)ãåŒã³åºããŸãã åç §å€æ°ããã¹ãããŠãfieldName == nullã䜿çšããŠåç §å ãå²ãåœãŠãããŠãããã©ããã確èªããããšã¯ã§ããŸãããåç §èªäœã§ã¯ãªãã(ååšããªãå¯èœæ§ããã) åç §å ã®å€ããã¹ãããããã§ãã æ³šé
9.4 確å®ä»£å ¥
9.4.1 å šè¬
颿°ã¡ã³ããŒãŸãã¯å¿å颿°ã®å®è¡å¯èœã³ãŒãå ã®ç¹å®ã®å Žæã§ã¯ãç¹å®ã®éçãããŒåæ (§9.4.4) ã«ãã£ãŠã倿°ãèªåçã«åæåãããããå°ãªããšã 1 ã€ã®ä»£å ¥ã®ã¿ãŒã²ããã§ããããšãã³ã³ãã€ã©ã«ãã£ãŠèšŒæã§ããå Žåã倿°ã¯ç¢ºå®ã«å²ãåœãŠããããšèšãããŸãã
泚: éå ¬åŒã«è¿°ã¹ãããã«ã確å®ä»£å ¥ã®ã«ãŒã«ã以äžã«ç€ºããŸãã
- åæä»£å ¥ããã倿° (§9.4.2) ã¯ãåžžã«ç¢ºå®ä»£å ¥ããããã®ã¿ãªãããŸãã
- ãã®å Žæã«å°ããã¹ãŠã®å¯èœæ§ã®ããããã°ã©ã å®è¡ãã¹ã«å°ãªããšã次ãå«ãŸããå Žåãåæä»£å ¥è§£é€ããã倿° (§9.4.3) ã¯ãæå®ã®å Žæã«ç¢ºå®ä»£å ¥ããããã®ãšã¿ãªãããŸãã
- 倿°ãå·Šãªãã©ã³ãã§ããåçŽãªä»£å ¥ (§12.24.2)ã
- åè§£ä»£å ¥ (§12.24.3)ã倿°ã¯ãå ¥ãåã«ãªã£ãåè§£åãå«ããåè§£åã®deconstructor_elementãšããŠçºçããŸãã
- 倿°ãåºåãã©ã¡ãŒã¿ãŒãšããŠæž¡ãåŒã³åºãåŒ (§12.8.10) ãŸãã¯ãªããžã§ã¯ãäœæåŒ (§12.8.17.2)ã
- ããŒã«ã«å€æ°ã®å Žå:
äžèšã®éå ¬åŒã«ãŒã«ã®åºã«ãªãæ£åŒãªä»æ§ã«ã€ããŠã¯ã§9.4.2ã §9.4.3ããã㳠§9.4.4 ã§èª¬æãããŠããŸãã
泚é
struct_type 倿°ã®ã€ã³ã¹ã¿ã³ã¹å€æ°ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãåå¥ã«è¿œè·¡ãããã ãã§ãªãããŸãšããŠè¿œè·¡ãããŸãã §9.4.2ã§9.4.3ããã㳠§9.4.4 ã§èª¬æãããŠããã«ãŒã«ã«å ããŠã次ã®ã«ãŒã«ã struct_type 倿°ãšãã®ã€ã³ã¹ã¿ã³ã¹å€æ°ã«é©çšãããŸãã
- å æ¬ struct_type 倿°ã確å®ä»£å ¥ãããŠãããšã¿ãªãããŠããå Žåãã€ã³ã¹ã¿ã³ã¹å€æ°ã¯ç¢ºå®ä»£å ¥ããããã®ãšã¿ãªãããŸãã
- åã€ã³ã¹ã¿ã³ã¹å€æ°ã確å®ä»£å ¥ãããŠãããšã¿ãªãããŠããå Žåãstruct_type 倿°ã¯ç¢ºå®ä»£å ¥ããããã®ãšã¿ãªãããŸãã
確å®ä»£å ¥ã¯ã次ã®ã³ã³ããã¹ãã®èŠä»¶ã§ãã
倿°ã¯ãå€ãååŸãããåå Žæã§ç¢ºå®ä»£å ¥ãããŸãã
泚: ããã«ãããæªå®çŸ©ã®å€ãçºçããããšã¯ãããŸããã æ³šé
åŒå ã®å€æ°ã®åºçŸã¯ã次ã®å Žåãé€ãã倿°ã®å€ãååŸãããšèŠãªãããŸãã
- 倿°ã¯åçŽä»£å ¥ã®å·Šãªãã©ã³ãã§ãã
- 倿°ã¯ãåè§£ä»£å ¥ã®å·Šãªãã©ã³ãã®äžéšã§ãã
- 倿°ãåºåãã©ã¡ãŒã¿ãŒãšããŠæž¡ããããããŸãã¯
- 倿°ã¯ struct_type 倿°ã§ãããã¡ã³ã㌠ã¢ã¯ã»ã¹ã®å·Šãªãã©ã³ããšããŠçºçããŸãã
倿°ã¯ãåç §ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããåå Žæã«ç¢ºå®ä»£å ¥ãããŸãã
泚: ããã«ãããåŒã³åºããã颿°ã¡ã³ããŒãåæä»£å ¥ãããåç §ãã©ã¡ãŒã¿ãŒãèæ ®ã§ããããã«ãªããŸãã æ³šé
倿°ã¯ãå ¥åãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããåå Žæã«ç¢ºå®ä»£å ¥ãããŸãã
泚: ããã«ãããåŒã³åºããã颿°ã¡ã³ããŒãåæä»£å ¥ãããå ¥åãã©ã¡ãŒã¿ãŒãèæ ®ã§ããããã«ãªããŸãã æ³šé
颿°ã¡ã³ããŒã®ãã¹ãŠã®åºåãã©ã¡ãŒã¿ãŒã¯ã颿°ã¡ã³ããŒãè¿ãåå Žæ (return ã¹ããŒãã¡ã³ããŸãã¯é¢æ°ã¡ã³ããŒæ¬äœã®æ«å°Ÿã«å°éããå®è¡ãéããŠ) ã«ç¢ºå®ä»£å ¥ãããŸãã
泚: ããã«ããã颿°ã¡ã³ããŒãåºåãã©ã¡ãŒã¿ãŒã§æªå®çŸ©ã®å€ãè¿ããªããããã³ã³ãã€ã©ã¯å€æ°ã倿°ãžã®ä»£å ¥ãšåçã®åºåãã©ã¡ãŒã¿ãŒãšããŠåãåã颿°ã¡ã³ããŒåŒã³åºããèæ ®ã§ããŸãã æ³šé
ã³ã³ã¹ãã©ã¯ã¿ãŒåæååãæã€struct_typeã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã®
this倿°ã¯ããã®ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒãè¿ãåå Žæã§ç¢ºå®ã«å²ãåœãŠãããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒåæååãæããªã struct_type ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã«ã€ããŠã¯ãã §12.8.14:thisã®å²ãåœãŠãããŠããªãã€ã³ã¹ã¿ã³ã¹å€æ°ã¯ã³ã³ãã€ã«æãšã©ãŒãçæããŸããããã³ã³ã¹ãã©ã¯ã¿ãŒã®æ¬äœãå®è¡ãããåã«æ¢å®å€ã«æé»çã«åæåãããããåç §ããŠãã ããã
9.4.2 åæä»£å ¥ããã倿°
倿°ã®æ¬¡ã®ã«ããŽãªã¯ãåæä»£å ¥å€æ°ãšããŠåé¡ãããŸãã
- éç倿°
- ã¯ã©ã¹ ã€ã³ã¹ã¿ã³ã¹ã®ã€ã³ã¹ã¿ã³ã¹å€æ°ã
- åæä»£å ¥ãããæ§é äœå€æ°ã®ã€ã³ã¹ã¿ã³ã¹å€æ°ã
- é åã®èŠçŽ ã
- å€ãã©ã¡ãŒã¿ãŒã
- åç §ãã©ã¡ãŒã¿ãŒã
- å ¥åãã©ã¡ãŒã¿ãŒã
-
catchå¥ãŸãã¯foreachã¹ããŒãã¡ã³ãã§å®£èšããã倿°ã
9.4.3 åæä»£å ¥è§£é€ããã倿°
倿°ã®æ¬¡ã®ã«ããŽãªã¯ãåæä»£å ¥è§£é€å€æ°ãšããŠåé¡ãããŸãã
- åæä»£å ¥è§£é€ãããæ§é äœå€æ°ã®ã€ã³ã¹ã¿ã³ã¹å€æ°ã
- ã³ã³ã¹ãã©ã¯ã¿ãŒåæååã®ãªãæ§é äœã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã®
this倿°ãå«ãåºåãã©ã¡ãŒã¿ãŒ (ãã®ãããªthis倿°ã®æç¢ºãªä»£å ¥èŠä»¶ãæºãããªãçµæã«ã€ããŠã¯ã§12.8.14 ãåç §ããŠãã ãã)ã -
catchå¥ãŸãã¯foreachã¹ããŒãã¡ã³ãã§å®£èšãããŠããããŒã«ã«å€æ°ä»¥å€ã®ããŒã«ã«å€æ°ã
9.4.4 確å®ä»£å ¥ã決å®ããããã®æ£ç¢ºãªã«ãŒã«
9.4.4.1 å šè¬
䜿çšãããå倿°ã確å®ä»£å ¥ãããŠããããšã確èªããããã«ãã³ã³ãã€ã©ã¯ããã®ãµãããã¥ã¡ã³ãã§èª¬æãããŠããããã»ã¹ãšåçã®ããã»ã¹ã䜿çšããå¿ èŠããããŸãã
颿°ã¡ã³ããŒã®æ¬äœã¯ãåæä»£å ¥è§£é€ããã 1 ã€ä»¥äžã®å€æ°ã宣èšã§ããŸãã æåã«å²ãåœãŠãããŠããªã倿° v ããšã«ãã³ã³ãã€ã©ã¯é¢æ°ã¡ã³ããŒå ã®æ¬¡ã®åãã€ã³ãã§ v ã®æç¢ºãªä»£å ¥ç¶æ ãæ±ºå®ããå¿ èŠããããŸãã
- åã¹ããŒãã¡ã³ãã®å é
- åã¹ããŒãã¡ã³ãã®çµç¹ (§13.2)
- ã³ã³ãããŒã«ãå¥ã®ã¹ããŒãã¡ã³ããŸãã¯ã¹ããŒãã¡ã³ãã®çµç¹ã«è»¢éããåã¢ãŒã¯
- ååŒã®å é
- ååŒã®æåŸ
v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ã次ã®ããããã«ãªããŸãã
- 確å®ä»£å ¥ã ããã¯ããã®æç¹ãŸã§ã®ãã¹ãŠã®å¯èœãªå¶åŸ¡ãããŒã§ãv ã«å€ãå²ãåœãŠãããŠããããšã瀺ããŸãã
- 確å®ä»£å
¥ãããŠããªãã
boolåã®åŒã®æåŸã«ãã倿°ã®ç¶æ ã®å Žåã確å®ã«å²ãåœãŠãããªã倿°ã®ç¶æ ã¯ã次ã®ãµãç¶æ ã®ããããã«åé¡ãããå¯èœæ§ããããŸã (ãã ããå¿ ããããããŸãã)ã- true åŒã®åŸã®ç¢ºå®ä»£å ¥ã ãã®ç¶æ ã¯ãããŒã«åŒã true ãšããŠè©äŸ¡ãããå Žåãv ã確å®ä»£å ¥ãããããšã瀺ããŸãããããŒã«åŒã false ãšè©äŸ¡ãããå Žåã¯å¿ ãããä»£å ¥ãããŸããã
- false åŒã®åŸã®ç¢ºå®ä»£å ¥ã ãã®ç¶æ ã¯ãããŒã«åŒã falseãšããŠè©äŸ¡ãããå Žåãv ã確å®ä»£å ¥ãããããšã瀺ããŸãããããŒã«åŒã true ãšè©äŸ¡ãããå Žåã¯å¿ ãããä»£å ¥ãããŸããã
次ã®èŠåã¯ã倿° v ã®ç¶æ ãåå Žæã§ã©ã®ããã«æ±ºå®ãããããå¶åŸ¡ããŸãã
9.4.4.2 ã¹ããŒãã¡ã³ãã®äžè¬çãªã«ãŒã«
- v ã¯ã颿°ã¡ã³ããŒæ¬äœã®å é ã«ç¢ºå®ä»£å ¥ãããŸããã
- ä»ã®ã¹ããŒãã¡ã³ãã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ããã®ã¹ããŒãã¡ã³ãã®å é ã察象ãšãããã¹ãŠã®å¶åŸ¡ãããŒè»¢éã§ã v ã®ç¢ºå®ä»£å ¥ç¶æ ã確èªããããšã«ãã£ãŠæ±ºå®ãããŸãã ãã®ãããªãã¹ãŠã®å¶åŸ¡ãããŒè»¢éã§ v ã確å®ä»£å ¥ãããŠããå Žåã¯ãã¹ããŒãã¡ã³ãã®å é ã« v ã確å®ä»£å ¥ãããŸãã èããããå¶åŸ¡ãããŒè»¢éã®ã»ããã¯ãã¹ããŒãã¡ã³ãã®å°éå¯èœæ§ã確èªããå Žåãšåãæ¹æ³ã§æ±ºå®ãããŸã (§13.2)ã
-
ã
blockãcheckedãuncheckedãifãwhileãdoãforãforeachãlockãŸãã¯usingã¹ããŒãã¡ã³ãã®çµç¹ã®switchã®ç¢ºå®ä»£å ¥ç¶æ ã¯ããã®ã¹ããŒãã¡ã³ãã®çµç¹ãã¿ãŒã²ãããšãããã¹ãŠã®å¶åŸ¡ãããŒè»¢éã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã確èªããããšã§æ±ºå®ããŸãã ãã®ãããªãã¹ãŠã®å¶åŸ¡ãããŒè»¢éã§ v ã確å®ä»£å ¥ãããŠããå Žåã¯ãã¹ããŒãã¡ã³ãã®çµç¹ã« v ã確å®ä»£å ¥ãããŸãã ãã以å€ã®å Žåãv ã¯ã¹ããŒãã¡ã³ãã®çµç¹ã§ç¢ºå®ä»£å ¥ãããŸããã èããããå¶åŸ¡ãããŒè»¢éã®ã»ããã¯ãã¹ããŒãã¡ã³ãã®å°éå¯èœæ§ã確èªããå Žåãšåãæ¹æ³ã§æ±ºå®ãããŸã (§13.2)ã
泚: å°éäžèœã¹ããŒãã¡ã³ããžã®å¶åŸ¡ãã¹ããªããããv ã¯å°éäžèœã¹ããŒãã¡ã³ãã®å é ã§ç¢ºå®ä»£å ¥ãããŸãã æ³šé
9.4.4.3 ãããã¯ã¹ããŒãã¡ã³ããchecked ããã³ unchecked ã¹ããŒãã¡ã³ã
ãããã¯å
ã®ã¹ããŒãã¡ã³ãã»ãªã¹ãã®æåã®ã¹ããŒãã¡ã³ã (ãŸãã¯ã¹ããŒãã¡ã³ãã»ãªã¹ãã空ã®å Žåã¯ãããã¯ã®çµäºç¹) ãžã®å¶åŸ¡è»¢éã«ããã v ã®ç¢ºå®ä»£å
¥ç¶æ
ã¯ããããã¯ãããŸãã¯checkedã¹ããŒãã¡ã³ãã®åã® unchecked ã®ç¢ºå®ä»£å
¥ç¶æ
ãšåãã§ãã
9.4.4.4 åŒã¹ããŒãã¡ã³ã
expr åŒã§æ§æããã stmt åŒã¹ããŒãã¡ã³ãã®å Žå:
- v ã¯ãstmt ã®å é ãšåã expr ã®å é ã®ç¢ºå®ä»£å ¥ç¶æ ã§ãã
- v ã expr ã®æåŸã«ç¢ºå®ã«å²ãåœãŠãããŠããå Žåã¯ãstmt ã®çµç¹ã§ç¢ºå®ã«å²ãåœãŠãããŸãããã以å€ã®å Žåã¯ãstmt ã®çµç¹ã«ç¢ºå®ã«å²ãåœãŠãããªãã
9.4.4.5 宣èšã¹ããŒãã¡ã³ã
- stmtãåæååã®ãªã宣èšã¹ããŒãã¡ã³ãã§ããå Žåãv㯠stmtã®å é ãšåãã stmt ã®çµç¹ã§ç¢ºå®ä»£å ¥ãããŸãã
- stmtãåæååãæã€å®£èšã¹ããŒãã¡ã³ãã§ããå Žåãvã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãstmtãåæååãæã€å®£èšããšã« 1 ã€ã®ä»£å ¥ã¹ããŒãã¡ã³ã (宣èšé ) ãããã¹ããŒãã¡ã³ã ãªã¹ãã§ãããã®ããã«æ±ºå®ãããŸãã
9.4.4.6 If ã¹ããŒãã¡ã³ã
圢åŒã® stmt ã¹ããŒãã¡ã³ãã®å Žå:
if ( «expr» ) «then_stmt» else «else_stmt»
- v ã¯ãstmt ã®å é ãšåã expr ã®å é ã®ç¢ºå®ä»£å ¥ç¶æ ã§ãã
- v ã expr ã®çµç¹ã§ç¢ºå®ä»£å ¥ãããå Žåãthen_stmtãžã®å¶åŸ¡ãããŒè»¢éãšãelse_stmtãŸã㯠else å¥ããªãå Žåãstmt ã®çµç¹ãžã®å¶åŸ¡ãããŒè»¢éã§ç¢ºå®ä»£å ¥ãããŸãã
- v ã expr ã®æåŸã§ "true åŒã®åŸã®ç¢ºå®ä»£å ¥" ç¶æ ãç¶æããŠããå Žåãthen_stmt ãžã®å¶åŸ¡ãããŒè»¢éã§ç¢ºå®ä»£å ¥ãããä»ã®å¥ããªãå Žåã¯ãelse_stmt ãŸã㯠stmt ã®çµç¹ã§ç¢ºå®ä»£å ¥ãããŸããã
- v ã expr ã®æåŸã§ "false åŒã®åŸã®ç¢ºå®ä»£å ¥" ç¶æ ãç¶æããŠããå Žåãelse_stmtãžã®å¶åŸ¡ãããŒè»¢éã«ç¢ºå®ä»£å ¥ãããthen_stmt ãžã®å¶åŸ¡ãããŒè»¢éã§ã¯ç¢ºå®ä»£å ¥ãããŸããã then_stmt ã®çµç¹ã§ç¢ºå®ä»£å ¥ãããŠããå Žåã®ã¿ãstmt ã®çµç¹ã§ç¢ºå®ä»£å ¥ãããŸãã
- ãã以å€ã®å Žåãv ã¯ãthen_stmt ãŸã㯠else_stmt ãžã®å¶åŸ¡ãããŒè»¢éããŸã㯠else å¥ããªãå Žåã¯stmt ã®ãšã³ããã€ã³ããžã®å¶åŸ¡ãããŒè»¢éã§ç¢ºå®ä»£å ¥ãããªããã®ãšã¿ãªãããŸãã
9.4.4.7 Switch ã¹ããŒãã¡ã³ã
å¶åŸ¡åŒ switch ããã ã¹ããŒãã¡ã³ã stmt ã®å Žå:
expr ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãstmt ã®å é ã«ãã v ã®ç¶æ ãšåãã§ãã
ã±ãŒã¹ã®ã¬ãŒãå¥ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ã¯ã
- v ã switch_label ã§å®£èšããããã¿ãŒã³å€æ°ã§ããå Žå: "確å®ä»£å ¥"ã
- ãã®ã¬ãŒãå¥ãå«ãã¹ã€ãã ã©ãã«ã«å°éã§ããªãå Žå (§13.8.3) : "確å®ä»£å ¥"ã
- ãã以å€ã®å Žåãv ã®ç¶æ ã¯ãexpr åŸã® v ã®ç¶æ ãšåãã§ãã
äŸ: 2 çªç®ã®ã«ãŒã«ã§ã¯ãã¢ã¯ã»ã¹ã§ããªãã³ãŒãã§ä»£å ¥ãããŠããªã倿°ã«ã¢ã¯ã»ã¹ããå Žåã«ãã³ã³ãã€ã©ããšã©ãŒãçºè¡ããå¿ èŠããªããªããŸãã b ã®ç¶æ ã¯ãå°éäžèœãª switch ã©ãã«
case 2 when bã§ "確å®ä»£å ¥ãããŸã"ãbool b; switch (1) { case 2 when b: // b is definitely assigned here. break; }çµäºãµã³ãã«
å°éå¯èœãª switch ããã㯠ã¹ããŒãã¡ã³ã ãªã¹ããžã®å¶åŸ¡ãããŒè»¢éã® v ã®ç¢ºå®ä»£å ¥ã¯ã
- å¶åŸ¡è»¢éã®åå ã 'goto case' ãŸã㯠'goto default' ã¹ããŒãã¡ã³ãã®å Žåãv ã®ç¶æ ã¯ããã® 'goto' ã¹ããŒãã¡ã³ãã®å é ã®ç¶æ ãšåãã§ãã
- å¶åŸ¡è»¢éã switch ã®
defaultã©ãã«ã«ãããã®ã§ããå Žåãv ã®ç¶æ ã¯ãexpr ã®åŸã® v ã®ç¶æ ãšåãã§ãã - å¶åŸ¡è»¢éãå°éäžèœ switch ã©ãã«ã«ãããã®ã§ããå Žåãv ã®ç¶æ 㯠"確å®ä»£å ¥ãããŸã"ã
- å¶åŸ¡è»¢éãã¬ãŒãå¥ãæã€å°éå¯èœãª switch ã©ãã«ã«ãããã®ã§ããå Žåãv ã®ç¶æ ã¯ãã¬ãŒãå¥ã®åŸã® v ã®ç¶æ ãšåãã§ãã
- å¶åŸ¡è»¢éãã¬ãŒãå¥ã®ãªãå°éå¯èœãª switch ã©ãã«ã«ãããã®ã§ããå Žåãv ã®ç¶æ
ã¯æ¬¡ã®ããã«ãªããŸãã
- v ã switch_label ã§å®£èšããããã¿ãŒã³å€æ°ã§ããå Žå: "確å®ä»£å ¥"ã
- ãã以å€ã®å Žåãv ã®ç¶æ ã¯ãexpr åŸã® v ã®ç¶æ ãšåãã§ãã
ãããã®ã«ãŒã«ã®çµæãšããŠãswitch_label ã§å®£èšããããã¿ãŒã³å€æ°ã¯ããã®ã»ã¯ã·ã§ã³ã®å¯äžã®å°éå¯èœãª switch ã©ãã«ã§ãªãå Žåãswitch ã»ã¯ã·ã§ã³ã®ã¹ããŒãã¡ã³ãã§ "確å®ä»£å ¥ãããŸãã"ã
äŸ:
public static double ComputeArea(object shape) { switch (shape) { case Square s when s.Side == 0: case Circle c when c.Radius == 0: case Triangle t when t.Base == 0 || t.Height == 0: case Rectangle r when r.Length == 0 || r.Height == 0: // none of s, c, t, or r is definitely assigned return 0; case Square s: // s is definitely assigned return s.Side * s.Side; case Circle c: // c is definitely assigned return c.Radius * c.Radius * Math.PI; ⊠} }çµäºãµã³ãã«
9.4.4.8 while ã¹ããŒãã¡ã³ã
圢åŒã® stmt ã¹ããŒãã¡ã³ãã®å Žå:
while ( «expr» ) «while_body»
- v ã¯ãstmt ã®å é ãšåã expr ã®å é ã®ç¢ºå®ä»£å ¥ç¶æ ã§ãã
- v ã expr ã®æåŸã§ç¢ºå®ä»£å ¥ãããå Žåãwhile_body ããã³ stmt ã®çµç¹ãžã®å¶åŸ¡ãããŒè»¢éã§ç¢ºå®ä»£å ¥ãããŸãã
- v ã expr ã®æåŸã§ "true åŒã®åŸã®ç¢ºå®ä»£å ¥" ç¶æ ãç¶æããŠããå Žåãwhile_body ãžã®å¶åŸ¡ãããŒè»¢éã§ç¢ºå®ä»£å ¥ãããŸãããstmt ã®çµç¹ã§ã¯ã確å®ä»£å ¥ãããŸããã
- v ã expr ã®æåŸã§ "false åŒã®åŸã®ç¢ºå®ä»£å ¥" ç¶æ ãç¶æããŠããå Žåãstmt ã®çµç¹ãžã®å¶åŸ¡ãããŒè»¢éã§ç¢ºå®ä»£å ¥ãããwhile_body ãžã®å¶åŸ¡ãããŒè»¢éã§ã¯ç¢ºå®ä»£å ¥ãããŸããã
9.4.4.9 do ã¹ããŒãã¡ã³ã
圢åŒã® stmt ã¹ããŒãã¡ã³ãã®å Žå:
do «do_body» while ( «expr» ) ;
- v ã¯ãstmt ã®å é ãã do_body ãžã®å¶åŸ¡ãããŒè»¢éã§ãstmt ã®å é ãšåã確å®ä»£å ¥ç¶æ ãç¶æããŸãã
- v ã¯ãexpr ã®å é ã§ãdo_body ã®çµç¹ãšåã確å®ä»£å ¥ç¶æ ãç¶æããŸãã
- v ã expr ã®æåŸã§ç¢ºå®ä»£å ¥ãããå Žåãstmt ã®çµç¹ãžã®å¶åŸ¡ãããŒè»¢éã§ç¢ºå®ä»£å ¥ãããŸãã
- v ã expr ã®æåŸã§ "false åŒã®åŸã®ç¢ºå®ä»£å ¥" ç¶æ ãç¶æããŠããå Žåãstmt ã®çµç¹ãžã®å¶åŸ¡ãããŒè»¢éã§ç¢ºå®ä»£å ¥ãããdo_body ãžã®å¶åŸ¡ãããŒè»¢éã§ã¯ç¢ºå®ä»£å ¥ãããŸããã
9.4.4.10 For ã¹ããŒãã¡ã³ã
圢åŒã®ã¹ããŒãã¡ã³ãã®å Žå:
for ( «for_initializer» ; «for_condition» ; «for_iterator» )
«embedded_statement»
確å®ä»£å ¥ãã§ãã¯ã¯ãã¹ããŒãã¡ã³ããèšè¿°ããããã®ããã«è¡ãããŸãã
{
«for_initializer» ;
while ( «for_condition» )
{
«embedded_statement» ;
LLoop: «for_iterator» ;
}
}
continue ã¹ããŒãã¡ã³ããã¿ãŒã²ãããšãã for ã¹ããŒãã¡ã³ãã¯ãã©ãã« goto ãã¿ãŒã²ãããšãã LLoop ã«å€æãããŸãã
for_condition ã for ã¹ããŒãã¡ã³ãã§çç¥ãããšã確å®ä»£å
¥ã®è©äŸ¡ã¯ãäžèšã®å±éã§ for_condition ã true ã«çœ®ãæãããããã®ããã«ç¶è¡ããŸãã
9.4.4.11 Breakãcontinue ããã³ goto ã¹ããŒãã¡ã³ã
ãbreak ãŸã㯠continue ã¹ããŒãã¡ã³ãã«ããå¶åŸ¡ãããŒè»¢éã® goto ã®ç¢ºå®ä»£å
¥ç¶æ
ã¯ããã®ã¹ããŒãã¡ã³ãã®å
é ã® v ã®ç¢ºå®ä»£å
¥ç¶æ
ãšåãã§ãã
9.4.4.12 Throw ã¹ããŒãã¡ã³ã
圢åŒã® stmt ã¹ããŒãã¡ã³ãã®å Žå:
throw «expr» ;
expr ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãstmt ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
9.4.4.13 Return ã¹ããŒãã¡ã³ã
圢åŒã® stmt ã¹ããŒãã¡ã³ãã®å Žå:
return «expr» ;
- expr ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãstmt ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
-
v ãåºåãã©ã¡ãŒã¿ãŒã§ããå Žåã¯ã次ã®ããããã確å®ä»£å
¥ããå¿
èŠããããŸãã
- expr ã®åŸ
- ãŸãã¯ã
finallyã¹ããŒãã¡ã³ããå²ãtry-finallyãŸãã¯try-catch-finallyã®returnãããã¯ã®æåŸã
圢åŒã® stmt ã¹ããŒãã¡ã³ãã®å Žå:
return ;
-
v ãåºåãã©ã¡ãŒã¿ãŒã§ããå Žåã¯ã次ã®ããããã確å®ä»£å
¥ããå¿
èŠããããŸãã
- stmt ã®å
- ãŸãã¯ã
finallyã¹ããŒãã¡ã³ããå²ãtry-finallyãŸãã¯try-catch-finallyã®returnãããã¯ã®æåŸã
9.4.4.14 Try-catch ã¹ããŒãã¡ã³ã
圢åŒã® stmt ã¹ããŒãã¡ã³ãã®å Žå:
try «try_block»
catch ( ... ) «catch_block_1»
...
catch ( ... ) «catch_block_n»
- try_block ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãstmt ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
- catch_block_i (ä»»æã® i ã«å¯Ÿãã) ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãstmt ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
- stmt ã®çµç¹ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãvããtry_block ã®çµç¹ããã³å catch_block_i (1 ãã n ã®å i) ã§ç¢ºå®ä»£å ¥ãããå Žå (ããã³ç¢ºå®ä»£å ¥ãããå Žåã®ã¿)ã確å®ä»£å ¥ããããããŸãã
9.4.4.15 Try-finally ã¹ããŒãã¡ã³ã
圢åŒã® stmt ã¹ããŒãã¡ã³ãã®å Žå:
try «try_block» finally «finally_block»
- try_block ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãstmt ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
- finally_block ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãstmt ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
-
stmt ã®æåŸã«ãã v ã®ç¢ºå®ä»£å
¥ç¶æ
ã¯ãå°ãªããšã次ã®ããããã true ã§ããå Žå (ããã³ true ã§ããå Žåã®ã¿) 確å®ä»£å
¥ãããŸãã
- v ã¯ãtry_block ã®çµç¹ã§ç¢ºå®ä»£å ¥ãããŸãã
- v ã¯ãfinally_block ã®çµç¹ã§ç¢ºå®ä»£å ¥ãããŸãã
goto å
ã§éå§ãã ã¹ããŒãã¡ã³ããªã©ã®å¶åŸ¡ãããŒè»¢éãå®è¡ãããtry_block å€ã§çµäºãããšãv ã finally_block ã®çµç¹ã§ç¢ºå®ä»£å
¥ãããå Žåãv ãå¶åŸ¡ãããŒè»¢éã§ç¢ºå®ä»£å
¥ãããŸãã (ããã¯ãv ããã®å¶åŸ¡ãããŒè»¢éã®å¥ã®çç±ã§ç¢ºå®ä»£å
¥ãããŠããå Žåã ãã§ãªãã確å®ä»£å
¥ãããŠãããšèŠãªãããŸã)ã
9.4.4.16 Try-catch-finally ã¹ããŒãã¡ã³ã
圢åŒã®ã¹ããŒãã¡ã³ãã®å Žå:
try «try_block»
catch ( ... ) «catch_block_1»
...
catch ( ... ) «catch_block_n»
finally «finally_block»
ã¹ããŒãã¡ã³ãããtry-finally ã¹ããŒãã¡ã³ããå²ã try-catch ã¹ããŒãã¡ã³ãïœå Žåã確å®ä»£å
¥åæãè¡ãããŸãã
try
{
try «try_block»
catch ( ... ) «catch_block_1»
...
catch ( ... ) «catch_block_n»
}
finally «finally_block»
äŸ: 次ã®äŸã¯ã
tryã¹ããŒãã¡ã³ãã®ããŸããŸãªããã㯠(§13.11) ãã©ã®ããã«ç¢ºå®ä»£å ¥ã«åœ±é¿ãããã瀺ããŠããŸããclass A { static void F() { int i, j; try { goto LABEL; // neither i nor j definitely assigned i = 1; // i definitely assigned } catch { // neither i nor j definitely assigned i = 3; // i definitely assigned } finally { // neither i nor j definitely assigned j = 5; // j definitely assigned } // i and j definitely assigned LABEL: ; // j definitely assigned } }çµäºãµã³ãã«
9.4.4.17 Foreach ã¹ããŒãã¡ã³ã
圢åŒã® stmt ã¹ããŒãã¡ã³ãã®å Žå:
foreach ( «type» «identifier» in «expr» ) «embedded_statement»
- expr ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãstmt ã®å é ã«ãã v ã®ç¶æ ãšåãã§ãã
- embedded_statement ãŸã㯠stmt ã®çµç¹ãžã®å¶åŸ¡ãããŒè»¢éã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr ã® æåŸã® v ã®ç¶æ ãšåãã§ãã
9.4.4.18 Using ã¹ããŒãã¡ã³ã
圢åŒã® stmt ã¹ããŒãã¡ã³ãã®å Žå:
using ( «resource_acquisition» ) «embedded_statement»
- resource_acquisition ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãstmt ã®å é ã«ãã v ã®ç¶æ ãšåãã§ãã
- embedded_statement ãžã®å¶åŸ¡ãããŒè»¢éã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãresource_acquisition ã®æåŸã«ãã v ã®ç¶æ ãšåãã§ãã
9.4.4.19 Lock ã¹ããŒãã¡ã³ã
圢åŒã® stmt ã¹ããŒãã¡ã³ãã®å Žå:
lock ( «expr» ) «embedded_statement»
- expr ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãstmt ã®å é ã«ãã v ã®ç¶æ ãšåãã§ãã
- embedded_statement ãžã®å¶åŸ¡ãããŒè»¢éã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr ã®æåŸã«ãã v ã®ç¶æ ãšåãã§ãã
9.4.4.20 Yield ã¹ããŒãã¡ã³ã
圢åŒã® stmt ã¹ããŒãã¡ã³ãã®å Žå:
yield return «expr» ;
- expr ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãstmt ã®å é ã«ãã v ã®ç¶æ ãšåãã§ãã
- stmt ã®æåŸã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr ã®æåŸã«ãã v ã®ç¶æ ãšåãã§ãã
yield break ã¹ããŒãã¡ã³ãã¯ã確å®ä»£å
¥ç¶æ
ã«ã¯åœ±é¿ããŸããã
9.4.4.21 宿°åŒã®äžè¬çãªã«ãŒã«
次ã¯ãä»»æã®å®æ°åŒã«é©çšãããé©çšãããå¯èœæ§ãããæ¬¡ã®ãµãã¯ã©ã¹ã®ã«ãŒã«ãããåªå ãããŸãã
å€ true ããã宿°åŒã®å Žå:
- v ãåŒã®åã§ç¢ºå®ä»£å ¥ãããŠããå Žåãv ã¯åŒã®åŸã§ç¢ºå®ä»£å ¥ãããŸãã
- ãã以å€ã®å Žå v ã¯ãåŒã®åŸã§ "false åŒã®åŸã®ç¢ºå®ä»£å ¥" ãããŸãã
äŸ:
int x; if (true) {} else { Console.WriteLine(x); }çµäºãµã³ãã«
å€ false ããã宿°åŒã®å Žå:
- v ãåŒã®åã§ç¢ºå®ä»£å ¥ãããŠããå Žåãv ã¯åŒã®åŸã§ç¢ºå®ä»£å ¥ãããŸãã
- ãã以å€ã®å Žå v ã¯ãåŒã®åŸã§ "true åŒã®åŸã®ç¢ºå®ä»£å ¥" ãããŸãã
äŸ:
int x; if (false) { Console.WriteLine(x); }çµäºãµã³ãã«
ä»ã®ãã¹ãŠã®å®æ°åŒã®å ŽåãåŒã®åŸã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãåŒã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
9.4.4.22 åçŽåŒã®äžè¬çãªã«ãŒã«
次ã®èŠåã¯ããªãã©ã« (§12.8.2)ãåçŽå (§12.8.4)ãã¡ã³ã㌠ã¢ã¯ã»ã¹åŒ (§12.8.7)ãã€ã³ããã¯ã¹ã®ãªãåºæ¬ã¢ã¯ã»ã¹åŒ (§12.8.7) ã®åŒã«é©çšãããŸãã )ã typeof åŒ (§12.8.18)ãæ¢å®å€ã®åŒ (§12.8.21)ã nameof åŒ (§12.8.23)ã宣èšåŒ (§12.20)ã
- ãã®ãããªåŒã®æåŸã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãåŒã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
9.4.4.23 åã蟌ã¿åŒã«é¢ããäžè¬çãªã«ãŒã«
次ã®èŠåã¯ã次ã®çš®é¡ã®åŒã«é©çšãããŸãã芪ååŒ (§12.8.5)ãã¿ãã« ãªãã©ã« (§12.8.6)ãèŠçŽ ã¢ã¯ã»ã¹åŒ (§12.8.12)ãã€ã³ããã¯ã¹ä»ãåºæ¬ã¢ã¯ã»ã¹åŒ (§12.8.15)ãã€ã³ã¯ãªã¡ã³ãåŒãšãã¯ãªã¡ã³ãåŒ (§12.8.16ã §12.9.7)ããã£ã¹ãåŒ (§12.9.8)ãåé
+åŒ (§12.9.8)ãåé
åŒã-ã~ã*åŒããã€ããª+ã-ã*ã/%ã<<ã>>ã<ã<=ã>ã>=ã==ã!=ãisãasã&ã|ã^åŒ (§12.13ã §12.14ã§12.15ã§12.16ãè€å代å
¥åŒ (§12.24.5)ãcheckedããã³uncheckedåŒ (§12.8.20)ãé
åããã³ããªã²ãŒãäœæåŒ (§12.8.17)ãããã³awaitåŒ (§12.9.9)ã
ãããã®ååŒã«ã¯ãåºå®é åºã§ç¡æ¡ä»¶ã«è©äŸ¡ããã 1 ã€ä»¥äžã®éšååŒããããŸãã
äŸ: äºé
%æŒç®åã¯ãæŒç®åã®å·ŠåŽã次ã«å³åŽãè©äŸ¡ããŸãã ã€ã³ããã¯ã¹äœææäœã¯ãã€ã³ããã¯ã¹ä»ãã®åŒãè©äŸ¡ããå·Šããå³ã®é ã«åã€ã³ããã¯ã¹åŒãè©äŸ¡ããŸãã çµäºãµã³ãã«
exprâ, exprâ, âŠ, exprâ ã®éšååŒãæã€ expr åŒã®å Žåãæ¬¡ã®é ã§è©äŸ¡ãããŸãã
- exprâ ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr ã®å é ã«ãã確å®ä»£å ¥ç¶æ ãšåãã§ãã
- expráµ¢ (1 ãã倧ãã i) ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpráµ¢ââ ã®æåŸã«ãã確å®ä»£å ¥ç¶æ ãšåãã§ãã
- expr ã®å é ã«ãã v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexprâ ã®æåŸã«ãã確å®ä»£å ¥ç¶æ ãšåãã§ãã
9.4.4.24 åŒã³åºãåŒãšãªããžã§ã¯ãçæåŒ
åŒã³åºãããã¡ãœããããéšåçãªã¡ãœãã宣èšãå®è£ ããŠããªãéšåã¡ãœããã§ããããåŒã³åºããçç¥ãããæ¡ä»¶ä»ãã¡ãœãããŸãã¯æ¡ä»¶ä»ãããŒã«ã«é¢æ° (§23.5.3.2ã §23.5.3.3) ã§ããå ŽåãåŒã³åºãåŸã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãåŒã³åºãåã® v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã ãã以å€ã®å Žåã¯ã次ã®ã«ãŒã«ãé©çšãããŸãã
圢åŒã®åŒã³åºãåŒ expr ã®å Žå:
«primary_expression» ( «argâ», «argâ», ⊠, «argâ» )
ãŸãã¯åœ¢åŒã®ãªããžã§ã¯ãçæåŒ expr ã®å Žå:
new «type» ( «argâ», «argâ», ⊠, «argâ» )
- åŒã³åºãåŒã®å Žåãprimary_expression åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr ã® v ã®ç¶æ ãšåãã§ãã
- åŒã³åºãåŒã®å Žåãargâ åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãprimary_expression ã®åŸã® v ã®ç¶æ ãšåãã§ãã
- ãªããžã§ã¯ãçæåŒã®å Žåãargâ åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr ã®åã® v ã®ç¶æ ãšåãã§ãã
- åŒæ° argi ããšã«ãargi ã®åŸã® v ã®æç¢ºãªä»£å ¥ç¶æ ã¯ãéåžžã®åŒã«ãŒã«ã«ãã£ãŠæ±ºå®ãããparameter_mode_modifierã¯ç¡èŠãããŸãã
- 1 ãã倧ãã i ã®åŒæ° argáµ¢ ã®å Žåãargáµ¢ ã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãargáµ¢ââ ã®åŸã® v ã®ç¶æ ãšåãã§ãã
- 倿° v ããä»»æã®åŒæ°ã§ã
outåŒæ° (ã€ãŸãã"out v" ã®åœ¢åŒã®åŒæ°) ãšããŠæž¡ãããå Žåãexpr ã®åŸã® v ã®ç¶æ ã¯ã確å®ä»£å ¥ãããŸãã ãã以å€ã®å Žåãexpr åŸã® v ã®ç¶æ ã¯ãargâ åŸã® v ã®ç¶æ ãšåãã§ãã - é ååæåå (§12.8.17.4)ããªããžã§ã¯ãåæåå (§12.8.17.2.2)ãã³ã¬ã¯ã·ã§ã³åæåå (§12.8.17.2.3)ãå¿åãªããžã§ã¯ãåæåå (§12.8.17.3) ã®å Žåã確å®ä»£å ¥ç¶æ ã¯ããããã®ã³ã³ã¹ãã©ã¯ããå®çŸ©ãããæ¡åŒµã«ãã£ãŠæ±ºå®ãããŸãã
9.4.4.25 åçŽãªä»£å ¥åŒãšåè§£ä»£å ¥åŒ
åŒ e å ã®ä»£å ¥å¯Ÿè±¡ã®ã»ãããæ¬¡ã®ããã«å®çŸ©ããŸãã
- e ãåè§£åã®å Žåãe ã®ä»£å ¥ã¿ãŒã²ãã㯠e ã®èŠçŽ ã®ä»£å ¥ã¿ãŒã²ããã®åéåã§ãã
- ãã以å€ã®å Žåãe ã®ä»£å ¥å¯Ÿè±¡ã¯ 3 ã§ãã
圢åŒã®åŒ expr ã®å Žå:
«expr_lhs» = «expr_rhs»
- expr_lhs ã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr ã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
- expr_rhs ã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr_lhs ã®åŸã® v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
- v ããexpr_lhs ã®ä»£å ¥å¯Ÿè±¡ã®å Žåãexpr åŸã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ã確å®ä»£å ¥ãããŸãã ãã以å€ã®å Žåãæ§é äœåã®ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒå ã§å²ãåœãŠãçºçããv ãæ§ç¯ãããã€ã³ã¹ã¿ã³ã¹ã§èªåçã«å®è£ ããããããã㣠P ã®é ããããã³ã° ãã£ãŒã«ãã§ãããP ãæå®ãããããã㣠ã¢ã¯ã»ã¹ãexpr_lhsã®å²ãåœãŠã¿ãŒã²ããã§ããå Žåãexpr åŸã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ç¢ºå®ã«å²ãåœãŠãããŸãã ãã以å€ã®å Žåãexpr ã®åŸã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr_rhs ã®åŸã® v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
äŸ: 次ã®ã³ãŒãäŸã®å 容:
class A { static void F(int[] arr) { int x; arr[x = 1] = x; // ok } }
xã 2 çªç®ã®åçŽãªä»£å ¥ã®å·ŠåŽãšããŠè©äŸ¡ãããåŸã倿°arr[x = 1]ã¯ã確å®ä»£å ¥ããããã®ãšã¿ãªãããŸããçµäºãµã³ãã«
9.4.4.26 && åŒ
圢åŒã®åŒ expr ã®å Žå:
«expr_first» && «expr_second»
- expr_first ã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr ã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
- expr_second ã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr_first ã® v ã®ç¶æ ã確å®ä»£å ¥ããããã"true åŒã®åŸã®ç¢ºå®ä»£å ¥" ã®ããããã®å Žå (ããã³ããããã®å Žåã®ã¿) 確å®ä»£å ¥ãããŸãã ãã以å€ã®å Žåã¯ã確å®ä»£å ¥ãããŸããã
-
expr ã®åŸã® v ã®ç¢ºå®ä»£å
¥ç¶æ
ã¯ã次ã«ãã£ãŠæ±ºå®ãããŸãã
- expr_first ã®åŸã® v ã®ç¶æ ã¯ã確å®ä»£å ¥ããããã®åŸãexpr ã® v ã®ç¶æ ãã確å®ä»£å ¥ãããŸãã
- ãã以å€ã®å Žåãexpr_second ã®åŸã® v ã®ç¶æ ã確å®ä»£å ¥ãããexpr_first ã® v ã®ç¶æ ãã"false åŒã®åŸã®ç¢ºå®ä»£å ¥" ãšãªããexpr ã®åŸã® v ã®ç¶æ ãã確å®ä»£å ¥ãããŸãã
- ãã以å€ã®å Žåãexpr_second ã®åŸã® v ã®ç¶æ ãã確å®ä»£å ¥ããããã"true åŒã®åŸã®ç¢ºå®ä»£å ¥" ã«ãªãããã®åŸãexpr ã®åŸã® v ã®ç¶æ ãã"true åŒã®åŸã®ç¢ºå®ä»£å ¥" ãšãªããŸãã
- ãã以å€ã®å Žåãexpr_first ã®åŸã® v ã®ç¶æ ãã"false åŒã®åŸã®ç¢ºå®ä»£å ¥" ãšãªããexpr_second ã®åã® v ã®ç¶æ ãã"false åŒã®åŸã®ç¢ºå®ä»£å ¥" ãšãªãããã®åŸãexpr ã®åŸã® v ã®ç¶æ ãã"false åŒã®åŸã®ç¢ºå®ä»£å ¥" ãšãªããŸãã
- ãã以å€ã®å Žåãexpr ã®åŸã® v ã®ç¶æ ã¯ã確å®ä»£å ¥ãããŸããã
äŸ: 次ã®ã³ãŒãäŸã®å 容:
class A { static void F(int x, int y) { int i; if (x >= 0 && (i = y) >= 0) { // i definitely assigned } else { // i not definitely assigned } // i not definitely assigned } }倿°
iã¯ãifã¹ããŒãã¡ã³ãã®åã蟌ã¿ã¹ããŒãã¡ã³ãã®ããããã§ç¢ºå®ä»£å ¥ãããŸãããä»ã§ã¯ç¢ºå®ä»£å ¥ãããŸããã ã¡ãœããifã®Fã¹ããŒãã¡ã³ãã§ã¯ã倿°iããæåã®åã蟌ã¿ã¹ããŒãã¡ã³ãã§ç¢ºå®ä»£å ¥ãããŸããããã¯ãåŒ(i = y)ã®å®è¡ããã°ã©ã ããåžžã«ããã®åã蟌ã¿ã¹ããŒãã¡ã³ãã®å®è¡ããã°ã©ã ã«å è¡ããããã§ãã ããã«å¯Ÿãã倿°iã¯ã2 çªç®ã®åã蟌ã¿ã¹ããŒãã¡ã³ãã§ã¯ç¢ºå®ä»£å ¥ãããŸãããããã¯ãx >= 0ã false ããã¹ããããã®çµæã倿°iä»£å ¥è§£é€ãããå¯èœæ§ãããããã§ããçµäºãµã³ãã«
9.4.4.27 || åŒ
圢åŒã®åŒ expr ã®å Žå:
«expr_first» || «expr_second»
- expr_first ã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr ã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
- expr_secondåã® v ã®æç¢ºãªä»£å ¥ç¶æ ã¯ãexpr_firståŸã®v ã®ç¶æ ã確å®ã«å²ãåœãŠãããŠããå ŽåããŸã㯠"false åŒã®åŸã«ç¢ºå®ã«å²ãåœãŠããã" å Žåã«ã®ã¿ç¢ºå®ã«å²ãåœãŠãããŸãã ãã以å€ã®å Žåã¯ã確å®ä»£å ¥ãããŸããã
-
expr ã®åŸã® v ã®ç¢ºå®ä»£å
¥ç¶æ
ã¯ã次ã«ãã£ãŠæ±ºå®ãããŸãã
- expr_first ã®åŸã® v ã®ç¶æ ã¯ã確å®ä»£å ¥ããããã®åŸãexpr ã® v ã®ç¶æ ãã確å®ä»£å ¥ãããŸãã
- ãã以å€ã®å Žåãexpr_second ã®åŸã® v ã®ç¶æ ã確å®ä»£å ¥ãããexpr_first ã® v ã®ç¶æ ãã"true åŒã®åŸã®ç¢ºå®ä»£å ¥" ãšãªããexpr ã®åŸã® v ã®ç¶æ ãã確å®ä»£å ¥ãããŸãã
- ãã以å€ã®å Žåãexpr_second ã®åŸã® v ã®ç¶æ ãã確å®ä»£å ¥ããããã"true åŒã®åŸã®ç¢ºå®ä»£å ¥" ã«ãªãããã®åŸãexpr ã®åŸã® v ã®ç¶æ ãã"true åŒã®åŸã®ç¢ºå®ä»£å ¥" ãšãªããŸãã
- ãã以å€ã®å Žåãexpr_firståŸã® v ã®ç¶æ ã "true åŒã®åŸã«ç¢ºå®ã«å²ãåœãŠãããŸã"ãexpr_secondåŸã® v ã®ç¶æ ã "true åŒã®åŸã«ç¢ºå®ã«å²ãåœãŠããã" å Žåãexpr ã®åŸã® v ã®ç¶æ 㯠"true åŒã®åŸã«ç¢ºå®ã«å²ãåœãŠãããŸã"ã
- ãã以å€ã®å Žåãexpr ã®åŸã® v ã®ç¶æ ã¯ã確å®ä»£å ¥ãããŸããã
äŸ: 次ã®ã³ãŒãäŸã®å 容:
class A { static void G(int x, int y) { int i; if (x >= 0 || (i = y) >= 0) { // i not definitely assigned } else { // i definitely assigned } // i not definitely assigned } }倿°
iã¯ãifã¹ããŒãã¡ã³ãã®åã蟌ã¿ã¹ããŒãã¡ã³ãã®ããããã§ç¢ºå®ä»£å ¥ãããŸãããä»ã§ã¯ç¢ºå®ä»£å ¥ãããŸããã ã¡ãœããifã®Gã¹ããŒãã¡ã³ãã§ã¯ã倿°iãã2 çªç®ã®åã蟌ã¿ã¹ããŒãã¡ã³ãã§ç¢ºå®ä»£å ¥ãããŸããããã¯ãåŒ(i = y)ã®å®è¡ããã°ã©ã ããåžžã«ããã®åã蟌ã¿ã¹ããŒãã¡ã³ãã®å®è¡ããã°ã©ã ã«å è¡ããããã§ãã ããã«å¯Ÿãã倿°iã¯ãæåã®åã蟌ã¿ã¹ããŒãã¡ã³ãã§ã¯ç¢ºå®ä»£å ¥ãããŸãããããã¯ãx >= 0ã true ããã¹ããããã®çµæã倿°iä»£å ¥è§£é€ãããå¯èœæ§ãããããã§ããçµäºãµã³ãã«
9.4.4.28 ! åŒ
圢åŒã®åŒ expr ã®å Žå:
! «expr_operand»
- expr_operand ã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr ã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
-
expr ã®åŸã® v ã®ç¢ºå®ä»£å
¥ç¶æ
ã¯ã次ã«ãã£ãŠæ±ºå®ãããŸãã
-
vã®åŸã® ã®ç¶æ ã¯ã確å®ä»£å ¥ããããã®åŸãvã® ã®ç¶æ ãã確å®ä»£å ¥ãããŸãã - ãã以å€ã®å Žåã
vã®åŸã® ã®ç¶æ ãã"false åŒã®åŸã®ç¢ºå®ä»£å ¥" ãšãªããvã® ã®ç¶æ ãã"true åŒã®åŸã®ç¢ºå®ä»£å ¥" ãšãªããŸãã - ãã以å€ã®å Žåã
vã®åŸã® ã®ç¶æ ãã"true åŒã®åŸã®ç¢ºå®ä»£å ¥" ãšãªããexpr ã® v ã®ç¶æ ãã"false åŒã®åŸã®ç¢ºå®ä»£å ¥" ãšãªããŸãã - ãã以å€ã®å Žåã
vã®åŸã® ã®ç¶æ ã¯ã確å®ä»£å ¥ãããŸããã
-
9.4.4.29 ?? åŒ
圢åŒã®åŒ expr ã®å Žå:
«expr_first» ?? «expr_second»
- expr_first ã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr ã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
- expr_second ã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr_first ã®åŸã® v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
-
expr ã®åŸã® v ã®ç¢ºå®ä»£å
¥ç¶æ
ã¯ã次ã«ãã£ãŠæ±ºå®ãããŸãã
-
expr_firstå€ãã®å®æ°åŒ (
null) ã®å Žåãexpr ã®åŸã® v ã®ç¶æ ã¯ãexpr_secondåŸã® v ã®ç¶æ ãšåãã§ãã - expr_firstã«çŽæ¥ (§12.1) null æ¡ä»¶åŒ E ãå«ãŸããŠãããv ã鿡件ä»ã察å¿ãã Eâ (§9.4.4.35) ã®åŸã«ç¢ºå®ã«å²ãåœãŠãããå Žåãexpr åŸã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr_secondåŸã® v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
- ãã以å€ã®å Žåãexpr ã®åŸã® v ã®ç¶æ ã¯ãexpr_first ã®åŸã® v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
-
expr_firstå€ãã®å®æ°åŒ (
泚: äžèšã®èŠåã§ã¯ã
a?.M(out x) ?? (x = false)ã®ãããªåŒã®å Žåãa?.M(out x)ãå®å šã«è©äŸ¡ãããnull 以å€ã®å€ãçæãããå Žåãxãå²ãåœãŠãããããx = falseãè©äŸ¡ããããã®å Žåxãå²ãåœãŠãããããšã圢åŒåãããŸãã ãããã£ãŠãxã¯ãã®åŒã®åŸã«åžžã«å²ãåœãŠãããŸããããã¯ãŸãã
dict?.TryGetValue(key, out var value) ?? falseåŸã« v ã確å®ã«å²ãåœãŠãããdict.TryGetValue(key, out var value)ãåŸã« "true ã®å Žåã¯ç¢ºå®ã«å²ãåœãŠããã" ããšã芳å¯ããfalseã "true ã®å Žåã¯ç¢ºå®ã«å²ãåœãŠã" å¿ èŠããããšçµè«ä»ããããšã§ãã·ããªãªãåŠçããŸããããäžè¬çãªå®åŒåã§ã¯ã次ã®ãããªããã€ãã®éåžžãšã¯ç°ãªãã·ããªãªã®åŠçãå¯èœã«ãªããŸãã
if (x?.M(out y) ?? (b && z.M(out y))) y.ToString();if (x?.M(out y) ?? z?.M(out y) ?? false) y.ToString();泚é
9.4.4.30 ?: åŒ
圢åŒã®åŒ expr ã®å Žå:
«expr_cond» ? «expr_true» : «expr_false»
- expr_cond ã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr ã®åã® v ã®ãšåãã§ãã
- expr_true ã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr_cond ã® v ã®ç¶æ ã確å®ä»£å ¥ããããã"true åŒã®åŸã®ç¢ºå®ä»£å ¥" ã®ããããã®å Žåã確å®ä»£å ¥ãããŸãã
- expr_false ã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr_cond ã® v ã®ç¶æ ã確å®ä»£å ¥ããããã"false åŒã®åŸã®ç¢ºå®ä»£å ¥" ã®ããããã®å Žåã確å®ä»£å ¥ãããŸãã
-
expr ã®åŸã® v ã®ç¢ºå®ä»£å
¥ç¶æ
ã¯ã次ã«ãã£ãŠæ±ºå®ãããŸãã
- expr_condãå€ã宿°åŒ (
true) ã®å Žåãexpr ã®åŸã® v ã®ç¶æ ã¯ãexpr_trueåŸã® v ã®ç¶æ ãšåãã§ãã - ãã以å€ã®å Žåãexpr_condãå€ã宿°åŒ (
false) ã®å Žåãexpr åŸã® v ã®ç¶æ ã¯ãexpr_falseåŸã® v ã®ç¶æ ãšåãã§ãã - ãã以å€ã®å Žåãexpr_true ã®åŸã® v ã®ç¶æ ã確å®ä»£å ¥ãããexpr_false ã® v ã®ç¶æ ãã確å®ä»£å ¥ããããã®åŸãexpr ã®åŸã® v ã®ç¶æ ãã確å®ä»£å ¥ãããŸãã
- ãã以å€ã®å Žåãexpr ã®åŸã® v ã®ç¶æ ã¯ã確å®ä»£å ¥ãããŸããã
- expr_trueåŸã® v ã®ç¶æ ã "true ã®å Žåã¯ç¢ºå®ã«å²ãåœãŠãããŸã" ã§ãexpr_falseåŸã® v ã®ç¶æ ã "true ã®å Žåã¯ç¢ºå®ã«å²ãåœãŠããã" å Žåãexpr ã®åŸã® v ã®ç¶æ 㯠"true ã®å Žåã¯ç¢ºå®ã«å²ãåœãŠãããŸãã
- expr_trueåŸã® v ã®ç¶æ ã "false ã®å Žåã¯ç¢ºå®ã«å²ãåœãŠãããŸã" ã§ãexpr_falseåŸã® v ã®ç¶æ ã "false ã®å Žåã¯ç¢ºå®ã«å²ãåœãŠãããŸã" å Žåãexpr ã®åŸã® v ã®ç¶æ 㯠"false ã®å Žåã¯ç¢ºå®ã«å²ãåœãŠãããŸãã
- expr_condãå€ã宿°åŒ (
泚: æ¡ä»¶åŒã®äž¡æ¹ã®ã¢ãŒã ãæ¡ä»¶ä»ãç¶æ ã«ãªããšã察å¿ããæ¡ä»¶ä»ãç¶æ ãçµåãããç¶æ ãè§£é€ãããæçµçãªç¶æ ã鿡件ä»ãã«ãªãã®ã§ã¯ãªãåæ ãããŸãã ããã«ãããæ¬¡ã®ãããªã·ããªãªãå¯èœã«ãªããŸãã
bool b = true; object x = null; int y; if (b ? x != null && Set(out y) : x != null && Set(out y)) { y.ToString(); } bool Set(out int x) { x = 0; return true; }泚é
9.4.4.31 å¿å颿°
æ¬æ (ãããã¯ãŸãã¯åŒ) ä»ãã® lambda_expression ãŸã㯠anonymous_method_expressionexpræ¬æ:
- ãã©ã¡ãŒã¿ã®ç¢ºå®ä»£å ¥ã¯ãååä»ãã¡ãœããã®ãã©ã¡ãŒã¿ãšåãã§ã (§9.2.6ã§9.2.7ã§9.2.8)ã
- æ¬æã®åã®å€éšå€æ° v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr ã®åã® v ã®ç¶æ ãšåãã§ãã ã€ãŸããå€éšå€æ°ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãå¿å颿°ã®ã³ã³ããã¹ãããç¶æ¿ãããŸãã
- expr ã®åŸã®å€éšå€æ° v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr ã®åã® v ã®ç¶æ ãšåãã§ãã
äŸ: äŸ
class A { delegate bool Filter(int i); void F() { int max; // Error, max is not definitely assigned Filter f = (int n) => n < max; max = 5; DoWork(f); } void DoWork(Filter f) { ... } }å¿å颿°ã宣èšãããŠããå Žæã§ max ã確å®ä»£å ¥ãããŠããªããããã³ã³ãã€ã«æãšã©ãŒãçæããŸãã
çµäºãµã³ãã«
äŸ: äŸ
class A { delegate void D(); void F() { int n; D d = () => { n = 1; }; d(); // Error, n is not definitely assigned Console.WriteLine(n); } }ãŸããå¿å颿°å ã®
nãžã®å²ãåœãŠãå¿å颿°ã®å€éšã®nã®ç¢ºå®ä»£å ¥ç¶æ ã«åœ±é¿ããªããããã³ã³ãã€ã«æãšã©ãŒãçæãããŸããçµäºãµã³ãã«
9.4.4.32 Throw åŒ
圢åŒã®åŒ expr ã®å Žå:
throw
thrown_expr
- thrown_expr ã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr ã®åã® v ã®ãšåãã§ãã
- expr ã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ã"確å®ä»£å ¥" ã§ãã
9.4.4.33 ããŒã«ã«é¢æ°ã®å€æ°ã®ã«ãŒã«
ããŒã«ã«é¢æ°ã¯ã芪ã¡ãœããã®ã³ã³ããã¹ãã§åæãããŸãã ããŒã«ã«é¢æ°ã«ã¯ã颿°åŒã³åºããšããªã²ãŒã倿ãšãã 2 ã€ã®å¶åŸ¡ãã㌠ãã¹ããããŸãã
åããŒã«ã«é¢æ°ã®æ¬æã«å¯Ÿãã確å®ä»£å
¥ã¯ãåŒã³åºãæ ç¹ããšã«åå¥ã«å®çŸ©ãããŸãã åŒã³åºãã®ãã³ã«ãããŒã«ã«é¢æ°ããã£ããã£ãã倿°ã¯ãåŒã³åºãæç¹ã§ç¢ºå®ä»£å
¥ãããå Žåã確å®ä»£å
¥ããããã®ãšã¿ãªãããŸãã ãã®æç¹ã§ããŒã«ã«é¢æ°æ¬æãžã®å¶åŸ¡ãã㌠ãã¹ãååšããå°éå¯èœãšã¿ãªãããŸãã ããŒã«ã«é¢æ°ã®åŒã³åºãåŸã颿°ãé¢ãããã¹ãŠã®å¶åŸ¡ãã€ã³ãã§ç¢ºå®ä»£å
¥ããããã£ããã£æžã¿å€æ° (return ã¹ããŒãã¡ã³ããyield ã¹ããŒãã¡ã³ããawait åŒ) ã¯ãåŒã³åºãå Žæã®åŸã«ç¢ºå®ä»£å
¥ããããšã¿ãªãããŸãã
ããªã²ãŒã倿ã«ã¯ãããŒã«ã«é¢æ°æ¬æãžã®å¶åŸ¡ãã㌠ãã¹ããããŸãã 倿åã«ãã£ããã£ããã倿°ã確å®ä»£å ¥ãããŠããå Žåãæ¬æã«ã§ç¢ºå®ä»£å ¥ãããŸãã ããŒã«ã«é¢æ°ãä»£å ¥ãã倿°ã¯ã倿åŸã¯ä»£å ¥ããããã®ãšããŠã¿ãªãããŸããã
泚: äžèšã¯ãããŒã«ã«é¢æ°ã®åŒã³åºããŸãã¯ããªã²ãŒã倿ã®ãã³ã«ãæ¬åã確å®ä»£å ¥ã®ããã«ååæãããããšãæå³ããŸãã ã³ã³ãã€ã©ã¯ãåŒã³åºããŸãã¯ããªã²ãŒã倿ã®ãã³ã«ããŒã«ã«é¢æ°ã®æ¬åãååæããå¿ èŠã¯ãããŸããã å®è£ ã§ã¯ããã®èª¬æãšåçã®çµæãçæãããå¿ èŠããããŸãã æ³šé
äŸ: 次ã®äŸã¯ãããŒã«ã«é¢æ°ã§ãã£ããã£ããã倿°ã«å¯Ÿãã確å®ä»£å ¥ã瀺ããŠããŸãã ããŒã«ã«é¢æ°ãæžã蟌ãåã«ãã£ããã£ããã倿°ãèªã¿åãå Žåã¯ãããŒã«ã«é¢æ°ãåŒã³åºãåã«ããã£ããã£ããã倿°ã確å®ä»£å ¥ããå¿ èŠããããŸãã ããŒã«ã«é¢æ°
F1ã¯ãä»£å ¥ããªãã§sãèªã¿åããŸããF1ã確å®ä»£å ¥ãããåã«sãåŒã³åºããšãšã©ãŒã«ãªããŸããF2ã¯ãèªãåã«iãä»£å ¥ããŸããiã確å®ä»£å ¥ãããåã«åŒã³åºãããå ŽåããããŸãã ããã«ãF3ãF2ã§ç¢ºå®ä»£å ¥ããããããs2ã¯ãF2ã®åŸã«åŒã³åºãããå ŽåããããŸããvoid M() { string s; int i; string s2; // Error: Use of unassigned local variable s: F1(); // OK, F2 assigns i before reading it. F2(); // OK, i is definitely assigned in the body of F2: s = i.ToString(); // OK. s is now definitely assigned. F1(); // OK, F3 reads s2, which is definitely assigned in F2. F3(); void F1() { Console.WriteLine(s); } void F2() { i = 5; // OK. i is definitely assigned. Console.WriteLine(i); s2 = i.ToString(); } void F3() { Console.WriteLine(s2); } }çµäºãµã³ãã«
9.4.4.34 is-pattern åŒ
圢åŒã®åŒ expr ã®å Žå:
expr_operand 㯠pattern ã§ãã
- expr_operand ã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr ã®åã® v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
- 倿° 'v' ã pattern ã§å®£èšãããŠããå Žåãexpr ã®åŸã® 'v' ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ã"true ã®å Žåã¯ç¢ºå®ä»£å ¥" ã§ãã
- ãã以å€ã®å Žåãexpr ã®åŸã®âvâ ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr_operand ã®åŸã® âvâ ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
9.4.4.35 ?. åŒ
圢åŒã®åŒ E ã®å Žå:
«primary_expression» ?. «null_conditional_operation»
Eâ E ã®ånull_conditional_operationããå
é ã®?ãããã¹ãã§åé€ããŠååŸããåŒã«ã§ããŸãã (Eâ ã¯ãnull æ¡ä»¶åŒã« 察å¿ãã鿡件ä»ã åŒãšåŒã°ããŸã)ã
- E å ã®ä»»æã®æç¹ã§ã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãEâ å ã®å¯Ÿå¿ãããã€ã³ãã§ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
- e ã®åŸã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãprimary_expressionåŸã® v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
泚: null_conditional_operation ã¯å®éã«ã¯ææ³èŠåã§ã¯ãããŸããã代ããã«ãææ³ã§ãã®å Žæã§èš±å¯ãããŠããä»»æã®ãã©ãŒã ã衚ããŸãã ããã¯äŸ¿å®äžãããã§äœ¿çšãããŸãã æ³šé
泚: "çŽæ¥å å«" ãšããæŠå¿µã§ã¯ãä»ã®å€ãšæ¯èŒãããæ¡ä»¶ä»ãã¢ã¯ã»ã¹ãåæãããšãã«ãæ¯èŒçåçŽãª "ã©ãããŒ" åŒãã¹ãããã§ããŸãã ããšãã°ãäžè¬ã«ã
((a?.b(out x))!) == trueã¯ãa?.b == trueãšåããããŒç¶æ ã«ãªããŸãããã®ç®çã¯ãæ¡ä»¶ä»ãã¢ã¯ã»ã¹ã§å¯èœãªå€æã倿°ååšããå Žåã«åæãæ©èœã§ããããã«ããããšã§ãã ãã ãã倿ããŠãŒã¶ãŒå®çŸ©ã®å Žåã"state when not null" ãäŒéããããšã¯ã§ããŸããããã ããå ¥åã null 以å€ã®å Žåã«ã®ã¿åºåã null 以å€ã§ãããšããå¶çŽãåãå ¥ãããŠãŒã¶ãŒå®çŸ©ã®å€æãã«ãŠã³ãã§ããªãããã§ãã å¯äžã®äŸå€ã¯ããŠãŒã¶ãŒå®çŸ©å€æã®å ¥åã null é蚱容å€åã§ããå Žåã§ãã äŸãã°æ¬¡ãæããããŸãã
public struct S1 { } public struct S2 { public static implicit operator S2?(S1 s1) => null; }ããã«ã¯ã次ã®ãããªãªããããã倿ãå«ãŸããŸãã
string x; S1? s1 = null; _ = s1?.M1(x = "a") ?? s1.Value.M2(x = "a"); x.ToString(); // ok public struct S1 { public S1 M1(object obj) => this; public S2 M2(object obj) => new S2(); } public struct S2 { public static implicit operator S2(S1 s1) => default; }null æ¡ä»¶åŒå ã®ç¹å®ã®ãã€ã³ãã§å€æ°ãå²ãåœãŠãããŠãããã©ãããèæ ®ãããšãåã null æ¡ä»¶åŒå ã®å è¡ãã null æ¡ä»¶æŒç®ãæåãããšèŠãªãããšãã§ããŸãã
ããšãã°ãæ¡ä»¶åŒ
a?.b(out x)?.c(x)ãæå®ãããšã察å¿ãã鿡件ä»ãåŒã¯a.b(out x).c(x)ãxåã®?.c(x)ã®æç¢ºãªå²ãåœãŠç¶æ ãæ±ºå®ããå Žåãããšãã°ãa.b(out x)ã®ãä»®å®ãåæãå®è¡ã§ããçµæã®ç¶æ ã?.c(x)ãžã®å ¥åãšããŠäœ¿çšã§ããŸãã æ³šé
9.4.4.36 ããŒã«å®æ°åŒ
åŒ expr (expr ãboolå€ãæã€å®æ°åŒ) ã®å Žåãexpr ã®åŸã® v ã®ç¢ºå®ä»£å
¥ç¶æ
ã¯æ¬¡ã®ããã«æ±ºå®ãããŸãã
- expr ãå€ true ã®å®æ°åŒã§ãexpr ããåã® v ã®ç¶æ ã "確å®ã«å²ãåœãŠãããªã" å Žåãexpr ã®åŸã® v ã®ç¶æ 㯠"false ã®å Žåã¯ç¢ºå®ã«å²ãåœãŠãããŸãã
- expr ãå€ false ã®å®æ°åŒã§ãexpr ããåã® v ã®ç¶æ ã "確å®ã«å²ãåœãŠãããªã" å Žåãexpr ã®åŸã® v ã®ç¶æ 㯠"true ã®å Žåã¯ç¢ºå®ã«å²ãåœãŠãããŸãã
泚: åŒã«å®æ°å€ bool
falseãããå ŽåãåŒãtrueãè¿ãå¿ èŠãããåå²ã«å°éã§ããªãããšãæ³å®ãããŸãã ãããã£ãŠã倿°ã¯ããã®ãããªåå²ã§ç¢ºå®ã«å²ãåœãŠãããŠãããšèŠãªãããŸãã宿°åŒã«ã¢ã¯ã»ã¹ããåã«æ¡ä»¶ä»ãç¶æ ã«ãªãããšã¯æ³å®ãããŠããªãããã"expr ã¯å€ true ã®å®æ°åŒã§ãããexpr ã true ã®å Žåã¯ç¢ºå®ã«å²ãåœãŠãããåã® v ã®ç¶æ " ãªã©ã®ã·ããªãªãèæ ®ããå¿ èŠã¯ãããŸããã æ³šé
9.4.4.37 ==/!= åŒ
圢åŒã®åŒ expr ã®å Žå:
«expr_first» == «expr_second»
ããã§ã==ã¯å®çŸ©æžã¿ã®æ¯èŒæŒç®å (§12.15) ãŸãã¯ãªããæŒç®å (§12.4.8) ã§ãããexpr åŸã® v ã®æç¢ºãªä»£å
¥ç¶æ
ã¯æ¬¡ã«ãã£ãŠæ±ºå®ãããŸãã
-
expr_firstã«çŽæ¥ (§12.1) ãå«ãŸããŠããå Žåãnull æ¡ä»¶åŒ E ãš expr_second ãå€
nullãæã€å®æ°åŒã§ããã鿡件ä»ã察å¿ãã Eâ ã®åŸã® v ã®ç¶æ ã "確å®ã«å²ãåœãŠãããŸã" å Žåãexpr ã®åŸã® v ã®ç¶æ 㯠"false ã®å Žåã¯ç¢ºå®ã«å²ãåœãŠãããŸãã" - expr_firstã« null æ¡ä»¶åŒ E ãçŽæ¥å«ãŸããŠãããexpr_secondã null é蚱容å€åã®åŒããŸã㯠null 以å€ã®å€ãæã€å®æ°åŒã§ããã鿡件ä»ã察å¿ãã Eâ ã®åŸã® v ã®ç¶æ ã "確å®ã«å²ãåœãŠãããŠãã" å Žåãexpr ã®åŸã® v ã®ç¶æ 㯠"true ã®å Žåã¯ç¢ºå®ã«å²ãåœãŠãããŸãã
-
expr_firstã
boolåã§ãexpr_secondãå€trueãæã€å®æ°åŒã§ããå Žåãexpr åŸã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr_firståŸã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã -
expr_firstã
boolåã§ãexpr_secondãå€falseãæã€å®æ°åŒã§ããå Žåãexpr ã®åŸã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãè«çåŠå®åŒã®åŸã®!ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãexpr_firstã
圢åŒã®åŒ expr ã®å Žå:
«expr_first» != «expr_second»
ããã§ã!=ã¯å®çŸ©æžã¿ã®æ¯èŒæŒç®å (§12.15) ãŸãã¯ãªããæŒç®å (§12.4.8) ã§ãããexpr åŸã® v ã®æç¢ºãªä»£å
¥ç¶æ
ã¯æ¬¡ã«ãã£ãŠæ±ºå®ãããŸãã
-
expr_firstã« null æ¡ä»¶åŒ E ãçŽæ¥å«ãŸããŠãããexpr_secondãå€
nullãæã€å®æ°åŒã§ããã鿡件ä»ã察å¿ãã Eâ ã®åŸã® v ã®ç¶æ ã "確å®ã«å²ãåœãŠãããŠãã" å Žåãexpr ã®åŸã® v ã®ç¶æ 㯠"true ã®å Žåã¯ç¢ºå®ã«å²ãåœãŠãããŸãã - expr_firstã« null æ¡ä»¶åŒ E ãçŽæ¥å«ãŸããŠãããexpr_secondã null é蚱容å€åã®åŒããŸã㯠null 以å€ã®å€ãæã€å®æ°åŒã§ããã鿡件ä»ã察å¿ãã Eâ ã®åŸã® v ã®ç¶æ ã "確å®ã«å²ãåœãŠãããŠãã" å Žåãexpr ã®åŸã® v ã®ç¶æ 㯠"false ã®å Žåã¯ç¢ºå®ã«å²ãåœãŠãããŸãã"
-
expr_firstã
boolåã§ãexpr_secondãå€trueãæã€å®æ°åŒã§ããå Žåãexpr ã®åŸã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãè«çåŠå®åŒã®åŸã®!ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãexpr_firstã -
expr_firstã
boolåã§ãexpr_secondãå€falseãæã€å®æ°åŒã§ããå Žåãexpr åŸã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr_firståŸã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
äžèšã®èŠåã¯ãã¹ãŠå¯æã§ãã
泚: ãããã®ã«ãŒã«ã«ãã£ãŠè¡šãããäžè¬çãªèãæ¹ã¯æ¬¡ã®ãšããã§ãã
- æ¡ä»¶ä»ãã¢ã¯ã»ã¹ã
nullãšæ¯èŒãããå Žåãæ¯èŒã®çµæãfalseå Žåãæäœã¯ééããªãçºçããŸãã- æ¡ä»¶ä»ãã¢ã¯ã»ã¹ã null é蚱容å€åãŸã㯠null 以å€ã®å®æ°ãšæ¯èŒãããå Žåãæ¯èŒã®çµæã
trueãããå Žåãæäœã¯ééããªãçºçããŸãã- ãŠãŒã¶ãŒå®çŸ©æŒç®åã¯ãåæåã®å®å šæ§ãé¢ä¿ããå Žåã«ä¿¡é Œæ§ã®é«ãåçãæäŸããããã«ä¿¡é Œã§ããªããããæ°ããã«ãŒã«ã¯ãå®çŸ©æžã¿ã®
==/!=æŒç®åã䜿çšãããŠããå Žåã«ã®ã¿é©çšãããŸãããããã®ã«ãŒã«ã®çµæã¯æ¬¡ã®ãšããã§ãã
if (a?.b(out var x) == true) x() else x();'else' ãã©ã³ãã§ãšã©ãŒãçºçããŸãif (a?.b(out var x) == 42) x() else x();'else' ãã©ã³ãã§ãšã©ãŒãçºçããŸãif (a?.b(out var x) == false) x() else x();'else' ãã©ã³ãã§ãšã©ãŒãçºçããŸãif (a?.b(out var x) == null) x() else x();'then' ãã©ã³ãã§ãšã©ãŒãçºçããŸãif (a?.b(out var x) != true) x() else x();'then' ãã©ã³ãã§ãšã©ãŒãçºçããŸãif (a?.b(out var x) != 42) x() else x();'then' ãã©ã³ãã§ãšã©ãŒãçºçããŸãif (a?.b(out var x) != false) x() else x();'then' ãã©ã³ãã§ãšã©ãŒãçºçããŸãif (a?.b(out var x) != null) x() else x();'else' ãã©ã³ãã§ãšã©ãŒãçºçããŸã泚é
9.4.4.38 ã¯æŒç®åã§ããããã¿ãŒã³åŒã§ã
圢åŒã®åŒ expr ã®å Žå:
«E» is «T»
ããã§ãT ã¯ä»»æã®åãŸãã¯ãã¿ãŒã³ã§ãã
E ããåã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãexpr ããåã® v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã
expr åŸã® v ã®æç¢ºãªä»£å ¥ç¶æ ã¯ã次ã«ãã£ãŠæ±ºå®ãããŸãã
-
E ã«çŽæ¥ (§12.1) null æ¡ä»¶åŒãå«ãŸããŠããã鿡件ä»ã察å¿ãã Eâ ã®åŸã® v ã®ç¶æ
ã "確å®ã«å²ãåœãŠãããŠãã" å Žåã
Tã¯ä»»æã®åãŸãã¯nullå ¥åãšäžèŽããªããã¿ãŒã³ã§ãããexpr åŸã® v ã®ç¶æ 㯠"true ã®å Žåã¯ç¢ºå®ã«å²ãåœãŠãããŸãã -
E ã« null æ¡ä»¶åŒãçŽæ¥å«ãŸããŠããã鿡件ä»ã察å¿ãã Eâ ã®åŸã® v ã®ç¶æ
ã "確å®ã«å²ãåœãŠãããŠãã" å Žåã
Tã¯nullå ¥åãšäžèŽãããã¿ãŒã³ã§ãããexpr ã®åŸã® v ã®ç¶æ 㯠"false ã®å Žåã¯ç¢ºå®ã«å²ãåœãŠãããŸãã -
E ã
boolåã§ãTãtrueå ¥åã«ã®ã¿äžèŽãããã¿ãŒã³ã§ããå Žåãexpr åŸã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãE ã®åŸã® v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã -
E ã
boolåã§ãTãfalseå ¥åã«ã®ã¿äžèŽãããã¿ãŒã³ã§ããå Žåãexpr ã®åŸã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã¯ãè«çåŠå®åŒ!ã®åŸã® v ã®ç¢ºå®ä»£å ¥ç¶æ ãšåãã§ãã - ãã以å€ã®å ŽåãE ã®åŸã® v ã®ç¢ºå®ä»£å ¥ç¶æ ã "確å®ã«å²ãåœãŠãããŠãã" å Žåãexpr ã®åŸã® v ã®ç¢ºå®ä»£å ¥ç¶æ 㯠"確å®ã«å²ãåœãŠãããŸã"ã
-
E ã«çŽæ¥ (§12.1) null æ¡ä»¶åŒãå«ãŸããŠããã鿡件ä»ã察å¿ãã Eâ ã®åŸã® v ã®ç¶æ
ã "確å®ã«å²ãåœãŠãããŠãã" å Žåã
泚: ãã®ãµãã¯ã©ã¹ã¯ ã§9.4.4.37 ãšåæ§ã®ã·ããªãªã«å¯ŸåŠããŸãã ãã ããååž°ãã¿ãŒã³ã«ã¯å¯ŸåŠããŸãããäŸ:
(a?.b(out x), c?.d(out y)) is (object, object)ã æ³šé
9.5 倿°åç §
variable_reference ã¯ã倿°ãšããŠåé¡ãããåŒã§ãã variable_reference ã¯ãçŸåšã®å€ã®ãã§ãããšæ°ããå€ã®æ ŒçŽã®äž¡æ¹ã«ã¢ã¯ã»ã¹ã§ããã¹ãã¬ãŒãžã®å Žæã衚ããŸãã
variable_reference
: expression
;
泚: C ããã³ C++ ã§ã¯ãvariable_reference 㯠lvalue ãšåŒã°ããŸãã æ³šé
9.6 倿°åç §ã®ååæ§
次ã®ããŒã¿åã®èªã¿åããšæžã蟌ã¿ã¯ã¢ãããã¯ã§ããå¿
èŠããããŸã: boolã charã byteã sbyteã shortã ushortã uintã intã nintã nuintã floatãããã³åç
§åã ããã«ãåã®ãªã¹ãã®åºã«ãªãåãæã€åæåã®èªã¿åããšæžã蟌ã¿ãã¢ãããã¯ã§ããå¿
èŠããããŸãã
longãulongãdoubleãdecimal ããã³ãŠãŒã¶ãŒå®çŸ©ã®åãå«ãä»ã®åã®èªã¿åããšæžã蟌ã¿ã¯ãã¢ãããã¯ã«ããå¿
èŠã¯ãããŸããã ãã®ç®çã®ããã«èšèšãããã©ã€ãã©ãªé¢æ°ãšã¯å¥ã«ãã€ã³ã¯ãªã¡ã³ãããã¯ãªã¡ã³ãã®å Žåãªã©ãã¢ãããã¯ãªèªã¿åã/倿Ž/æžã蟌ã¿ã®ä¿èšŒã¯ãããŸããã
9.7 åç §å€æ°ãšæ»ãå€
9.7.1 å šè¬
reference variable ã¯ããªãã¡ã¬ã³ããšåŒã°ããå¥ã®å€æ°ãåç
§ãã倿°ã§ã (§9.2.6)ã åç
§å€æ°ã¯ã ref 修食åã§å®£èšãããããŒã«ã«å€æ°ãŸã㯠ref æ§é äœãã£ãŒã«ãã§ãã
åç
§å€æ°ã¯ããªãã¡ã¬ã³ãã®å€ã§ã¯ãªãããªãã¡ã¬ã³ããžã® variable_reference (§9.5) ãæ ŒçŽããŸãã åç
§å€æ°ã䜿çšããŠå€ãå¿
èŠãªå Žåããªãã¡ã¬ã³ãã®å€ãè¿ãããŸããåæ§ã«ãåç
§å€æ°ã代å
¥ã®ã¿ãŒã²ããã§ããå Žåãããã代å
¥å
ã®ãªãã¡ã¬ã³ãã«ãªããŸãã åç
§å€æ°ãåç
§ãã倿°ãã€ãŸããªãã¡ã¬ã³ãã®æ ŒçŽããã variable_reference ã¯ãref 代å
¥ (= ref) ã䜿çšããŠå€æŽã§ããŸãã
äŸ: 次ã®äŸã¯ããªãã¡ã¬ã³ããé åã®èŠçŽ ã§ããããŒã«ã«åç §å€æ°ã瀺ããŠããŸãã
public class C { public void M() { int[] arr = new int[10]; // element is a reference variable that refers to arr[5] ref int element = ref arr[5]; element += 5; // arr[5] has been incremented by 5 } }çµäºãµã³ãã«
åç §æ»ãå€ã¯ãref ã«ããæ»ãå€ã¡ãœãã (§15.6.1) ããè¿ãããvariable_referenceã§ãã ãã® variable_reference ã¯ãåç §ã®æ»ãå€ã®ãªãã¡ã¬ã³ãã§ãã
äŸ: 次ã®äŸã¯ããªãã¡ã¬ã³ããé åãã£ãŒã«ãã®èŠçŽ ã§ããããŒã«ã«åç §æ»ãå€ã瀺ããŠããŸãã
public class C { private int[] arr = new int[10]; public ref readonly int M() { // element is a reference variable that refers to arr[5] ref int element = ref arr[5]; return ref element; // return reference to arr[5]; } }çµäºãµã³ãã«
9.7.2 ref-safe-context
9.7.2.1 å šè¬
ãã¹ãŠã®åç §å€æ°ã¯ãåç §å€æ°ã® ref-safe-context ããªãã¡ã¬ã³ãã® ref-safe-context ãã倧ãããªãããšãä¿èšŒããå®å šã«ãŒã«ã«åŸããŸãã
泚: ã»ãŒãã³ã³ããã¹ã ã®é¢é£æŠå¿µã¯ãé¢é£ããå¶çŽãšå ±ã« (§16.8.15) ã§å®çŸ©ãããŠããŸãã æ³šé
倿°ã®å Žåã倿°ã® ref-safe-context ã¯ããã®å€æ°ãžã® variable_reference (§9.5) ãæå¹ãªã³ã³ããã¹ãã§ãã åç §å€æ°ã®ãªãã¡ã¬ã³ãã«ã¯ãåç §å€æ°èªäœã®ref-safe-context ãšåãå¹ ä»¥äžã® ref-safe-context ãå«ãŸããŠããå¿ èŠããããŸãã
泚: ã³ã³ãã€ã©ã¯ãããã°ã©ã ããã¹ãã®éçåæã«ãã£ãŠ ref-safe-context ãæ±ºå®ããŸãã ref-safe-context ã¯ãå®è¡æã®å€æ°ã®æå¹æéãåæ ããŸãã æ³šé
ref-safe-context ã«ã¯ã次㮠4 ã€ã®ã³ã³ããã¹ãããããŸãã
declaration-block: ããŒã«ã«å€æ° (§9.2.9.1) ãžã® variable_reference ã® ref-safe-context ã¯ããã®ã¹ã³ãŒãå ã®å ¥ãåã«ãªã£ãåã蟌ã¿ã¹ããŒãã¡ã³ããå«ãããŒã«ã«å€æ°ã®ã¹ã³ãŒã (§13.6.2) ã§ãã
ããŒã«ã«å€æ°ãžã® variable_reference ã¯ãåç §å€æ°ããã®å€æ°ã® ref-safe-context å ã§å®£èšãããŠããå Žåã«ã®ã¿ãåç §å€æ°ã®æå¹ãªãªãã¡ã¬ã³ãã«ãªããŸãã
function-member: 颿°å ã§ã¯ã次ã®ãããããžã® variable_reference ã¯ãfunction-member ã® ref-safe-context ããããŸãã
- ã¯ã©ã¹ ã¡ã³ããŒé¢æ°ã®æé»çãªãå«ãã颿°ã¡ã³ããŒå®£èšã®å€ãã©ã¡ãŒã¿ãŒ (
this)ã - æé»çã«ãããåºåãã©ã¡ãŒã¿ãŒ (
scoped ref)ã - æé»çã«
refãããæ§é äœã¡ã³ããŒé¢æ°ã®æé»çãªåç § () ãã©ã¡ãŒã¿ãŒ (this)scoped refãšãã®ãã£ãŒã«ãã
function-member ã® ref-safe-context ãæã€ variable_reference ã¯ãåç §å€æ°ãåã颿°ã¡ã³ããŒã§å®£èšãããŠããå Žåã«ã®ã¿æå¹ãªãªãã¡ã¬ã³ãã§ãã
- ã¯ã©ã¹ ã¡ã³ããŒé¢æ°ã®æé»çãªãå«ãã颿°ã¡ã³ããŒå®£èšã®å€ãã©ã¡ãŒã¿ãŒ (
return-only: 颿°å ã§ã¯ã次ã®ããããã® variable_reference ã«æ»ãå€ã®ã¿ã® ref-safe ã³ã³ããã¹ãããããŸãã
- æ§é äœã¡ã³ããŒé¢æ°ã®æé»çãªä»¥å€ã®åç
§ãã©ã¡ãŒã¿ãŒ (
this)ãããã³ - å ¥åãã©ã¡ãŒã¿ãŒ (§15.6.2.3.2)
ref-safe-context ãæ»ãå€ã®ã¿ã® variable_reference ã¯ãåç §æ»ãå€ã®åç §å ã«ããããšãã§ããŸãã
- æ§é äœã¡ã³ããŒé¢æ°ã®æé»çãªä»¥å€ã®åç
§ãã©ã¡ãŒã¿ãŒ (
caller-context: 颿°å ã§ã¯ã以äžã®ãããããžã® variable_reference ã« caller-context ã® ref-safe-context ããããŸãã
- åç §ãã©ã¡ãŒã¿ãŒãŸãã¯å ¥åãã©ã¡ãŒã¿ãŒã®ã¡ã³ã㌠ãã£ãŒã«ããšèŠçŽ ã
- ã¯ã©ã¹åã®ãã©ã¡ãŒã¿ãŒã®ã¡ã³ã㌠ãã£ãŒã«ããããã³
- é ååã®ãã©ã¡ãŒã¿ãŒã®èŠçŽ ã
caller-context ã® ref-safe-context ããã variable_reference ã¯ãåç §ã®æ»ãå€ã®ãªãã¡ã¬ã³ãã«ããããšãã§ããŸãã
ãããã®å€ã¯ãæãçã (declaration-block) ããæãåºã (caller-context) ãŸã§ã®å ¥ãåé¢ä¿ã圢æããŸãã å ¥ãåã«ãªã£ãåãããã¯ã¯ãç°ãªãã³ã³ããã¹ãã衚ããŸãã
äŸ: 次ã®ã³ãŒãã¯ãããŸããŸãª ref-safe-context ã®äŸã瀺ããŠããŸãã 宣èšã¯ã
ref倿°ã®åæååŒã«ãªããªãã¡ã¬ã³ã ã® ref-safe-context ã瀺ããŠããŸãã æ¬¡ã®äŸã¯ãåç §ã®æ»ãå€ã® ref-safe-context ã瀺ããŠããŸããpublic class C { // ref safe context of arr is "caller-context". // ref safe context of arr[i] is "caller-context". private int[] arr = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // ref safe context is "return-only" public ref int M1(ref int r1) { return ref r1; // r1 is safe to ref return } // ref safe context is "function-member" public ref int M2(int v1) { return ref v1; // error: v1 is not safe to ref return } public ref int M3() { int v2 = 5; return ref arr[v2]; // arr[v2] is safe to ref return } public void M4(int p) { int v3 = 6; // context of r2 is declaration-block, // ref safe context of p is function-member ref int r2 = ref p; // context of r3 is declaration-block, // ref safe context of v3 is declaration-block ref int r3 = ref v3; // context of r4 is declaration-block, // ref safe context of arr[v3] is caller-context ref int r4 = ref arr[v3]; } }ãµã³ãã«ã®çµäºã
äŸ:
structåã®å Žåãæé»çãªthisãã©ã¡ãŒã¿ãŒã¯åç §ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããŸãã function-member ãšããŠã®structåã®ãã£ãŒã«ãã® ref-safe-context ã§ã¯ããããã®ãã£ãŒã«ããåç §ã®æ»ãå€ã§è¿ããªãããã«ããŸãã ãã®ã«ãŒã«ã«ãããæ¬¡ã®ã³ãŒããçŠæ¢ãããŸããpublic struct S { private int n; // Disallowed: returning ref of a field. public ref int GetN() => ref n; } class Test { public ref int M() { S s = new S(); ref int numRef = ref s.GetN(); return ref numRef; // reference to local variable 'numRef' returned } }ãµã³ãã«ã®çµäºã
ããŒã«ã«å€æ°ãŸãã¯ãã©ã¡ãŒã¿ãŒã§ããåç §å€æ°ã®ã¹ã³ãŒãã¯æç€ºçã«æå®ã§ããŸãã §9.7.3 ãåç §ããŠãã ããã
9.7.2.2 ããŒã«ã«å€æ° ref-safe-context
ããŒã«ã«å€æ° v ã®å Žå:
-
vãåç §å€æ°ã®å Žåããã® ref-safe-context ã¯ãåæååŒã® ref-safe-context ãšåãã§ãã - ãã以å€ã®å Žåããã® ref-safe-context 㯠declaration-block ã§ãã
9.7.2.3 ãã©ã¡ãŒã¿ãŒ ref-safe-context
ãã©ã¡ãŒã¿ãŒ p ã®å Žå:
-
pãåç §ãŸãã¯å ¥åãã©ã¡ãŒã¿ãŒã®å Žåããã® ref-safe-context ã¯æ»ãå€ã®ã¿ã«ãªããŸããpãå ¥åãã©ã¡ãŒã¿ãŒã®å Žåãæžã蟌ã¿å¯èœãªrefãšããŠè¿ãããšã¯ã§ããŸããããref readonlyãšããŠè¿ãããšãã§ããŸãã -
pãåºåãã©ã¡ãŒã¿ãŒã®å Žåããã® ref-safe-context ã¯é¢æ°ã¡ã³ããŒã§ãã åºåãã©ã¡ãŒã¿ãŒã¯æé»çã«scoped refã - ãã以å€ã®å Žåã
pãæ§é äœåã®thisãã©ã¡ãŒã¿ãŒã§ããå Žåããã® ref-safe-context ã¯é¢æ°ã¡ã³ããŒã«ãªããŸãã æ§é äœã€ã³ã¹ã¿ã³ã¹ ã¡ãœããã®thisãã©ã¡ãŒã¿ãŒã¯æé»çã«scoped refã - ãã以å€ã®å Žåããã©ã¡ãŒã¿ãŒã¯å€ãã©ã¡ãŒã¿ãŒã§ããããã® ref-safe-context 㯠function-member ã§ãã
ãã©ã¡ãŒã¿ãŒã« [UnscopedRef] (§23.5.8) ã§æ³šéãä»ããããå Žåããã® ref-safe-context ã¯æ¢å®ãã 1 ã¬ãã«æ¡å€§ãããŸããfunction-member ã¯æ»ãå€ã®ã¿ã«ãªããæ»ãå€ã®ã¿åŒã³åºãå
ã³ã³ããã¹ãã«ãªããŸãã
äŸ: æ§é äœã€ã³ã¹ã¿ã³ã¹ ã¡ãœããã®æé»çãª
thisãã©ã¡ãŒã¿ãŒãscoped refãããæ¹æ³ (颿°ã¡ã³ããŒã® ref-safe ã³ã³ããã¹ã)ãããã³ãã£ãŒã«ãã® ref æ»ãå€ãæå¹[UnscopedRef]æ»ãå°çšã«æ¡å€§ããæ¹æ³ã瀺ããŸããusing System.Diagnostics.CodeAnalysis; struct S { private int _field; // Error: ref-safe-context of `this` is function-member, // so ref-safe-context of `_field` is also function-member, // which does not satisfy the return-only requirement. public ref int Bad() => ref _field; // OK: [UnscopedRef] widens `this` from function-member to // return-only, so `_field` also has ref-safe-context of // return-only, satisfying the ref return requirement. [UnscopedRef] public ref int Good() => ref _field; }çµäºãµã³ãã«
9.7.2.4 ãã£ãŒã«ã ref-safe-context
ãã£ãŒã«ã e.F ãžã®åç
§ãæå®ãã倿°ã®å Žå:
-
Fãåç §å€æ°ã®å Žåããã® ref-safe-context ã¯eã®ã»ãŒã ã³ã³ããã¹ãã§ãã - ãã以å€
eåç §åã®å Žåããã® ref-safe-context ã¯åŒã³åºãå ã³ã³ããã¹ãã§ãã - ãã以å€ã®å Žåã
eãå€åã®å Žåããã® ref-safe-context ã¯eã® ref-safe-context ãšåãã§ãã
ãã®çµæãåç
§å€æ°ã§ãããã£ãŒã«ãã¯ã ref struct ãŸã㯠readonly ref structããåç
§å€æ°ãšããŠè¿ãããå¯èœæ§ããããŸãããåç
§å€æ°ä»¥å€ã®ãã£ãŒã«ãã¯è¿ãããªãå ŽåããããŸãã
äŸ:
ref struct RS { ref int _refField; int _field; public ref int Prop1 => ref _refField; // OK public ref int Prop2 => ref _field; // Error }çµäºãµã³ãã«
9.7.2.5 ãªãã¬ãŒã¿ãŒ
æ¡ä»¶æŒç®å (§12.21)ã c ? ref e1 : ref e2ãããã³åç
§ä»£å
¥æŒç®åã¯ã = ref e (§12.24.1) ã®ãªãã©ã³ããšããŠåç
§å€æ°ãæã¡ãåç
§å€æ°ãçæããŸãã ãããã®æŒç®åã®å Žåãçµæã® ref-safe-context ã¯ããã¹ãŠã® ref ãªãã©ã³ãã® ref-safe-context ã®äžã§æãçãã³ã³ããã¹ãã§ãã
9.7.2.6 颿°ã®åŒã³åºã
倿° c ref ãè¿ã颿°åŒã³åºãã®çµæ ref e1.M(e2, ...)ã M() ã ref-to-ref-æ§é äœãè¿ããªãå Žåããã® ref-safe-context ã¯æ¬¡ã®ã³ã³ããã¹ãã®äžã§æãçããªããŸãã
- caller-contextã
- ã»ãŒã ã³ã³ããã¹ã (§16.8.15) ã¯ã
scopedãã©ã¡ãŒã¿ãŒã«å¯Ÿå¿ããåŒæ°ãé€å€ããoutåŒæ°ãé€å€ãããã¹ãŠã®åŒæ°åŒ (åä¿¡åŽãå«ã) ã«ãã£ãŠæäŸãããŸãã - ãã¹ãŠã®
refããã³ref readonlyåŒæ°ã«ãã£ãŠæäŸããã ref-safe-contextãscoped refãã©ã¡ãŒã¿ãŒã«å¯Ÿå¿ãããã®ãé€ããåŒæ°outé€å€ããŸãã
M()ã ref-to-ref-struct ãè¿ãå Žåãref-safe-context 㯠ref-to-ref-struct ã®ãã¹ãŠã®åŒæ°ã«ãã£ãŠæäŸãããæãçã ref-safe ã³ã³ããã¹ãã§ãã
ãããã®ã«ãŒã«ã®ç®çäžãæå®ãããåŒæ° expr ãã©ã¡ãŒã¿ãŒ pã«æž¡ãããŸãã
-
pãscoped refãããŠããå Žåãexpr㯠ref-safe-context ãæäŸããŸããã -
pãscopedãããŠããå Žåãexprã¯å®å šãªã³ã³ããã¹ããæäŸããŸããã -
pãoutãããŠããå Žåãexpr㯠ref-safe-context ãŸã㯠safe-context ãæäŸããŸããã
äŸ: æåŸã®ç®æ¡æžãã¯ã次ã®ãããªã³ãŒããåŠçããããã«å¿ èŠã§ãã
ref int M2() { int v = 5; // Not valid. // ref safe context of "v" is block. // Therefore, ref safe context of the return value of M() is block. return ref M(ref v); } ref int M(ref int p) { return ref p; }çµäºãµã³ãã«
ããããã£åŒã³åºããšã€ã³ãã¯ãµãŒåŒã³åºã ( get ãŸã㯠set) ã¯ãäžèšã®ã«ãŒã«ã«ãã£ãŠåºã«ãªãã¢ã¯ã»ãµãŒã®é¢æ°åŒã³åºããšããŠæ±ãããŸãã ããŒã«ã«é¢æ°ã®åŒã³åºãã¯ã颿°åŒã³åºãã§ãã
9.7.2.7 å€
å€ã® ref-safe-context ã¯ãæãè¿ãå€åŽã®æ ã®ã³ã³ããã¹ãã§ãã
泚: ããã¯ã
M(ref d.Length)ãådã§ããdynamicãªã©ã®åŒã³åºãã§çºçããŸãã ãŸããå ¥åãã©ã¡ãŒã¿ãŒã«å¯Ÿå¿ããåŒæ°ãšäžèŽããŸãã æ³šé
9.7.2.8 ã³ã³ã¹ãã©ã¯ã¿ãŒã®åŒã³åºã
ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºã new åŒã¯ãæ§ç¯ãããåãè¿ããšèŠãªãããã¡ãœããåŒã³åºã (§9.7.2.6) ãšåãã«ãŒã«ã«åŸããŸãã
9.7.2.9 åç §å€æ°ã«é¢ããå¶éäºé
- åç
§ãã©ã¡ãŒã¿ãŒãåºåãã©ã¡ãŒã¿ãŒãå
¥åãã©ã¡ãŒã¿ãŒã
refããŒã«ã«ãref structåã®ãã©ã¡ãŒã¿ãŒãŸãã¯ããŒã«ã«ã¯ãã©ã ãåŒãŸãã¯ããŒã«ã«é¢æ°ã«ãã£ãŠãã£ããã£ãããŸããã - åç
§ãã©ã¡ãŒã¿ãŒãåºåãã©ã¡ãŒã¿ãŒãå
¥åãã©ã¡ãŒã¿ãŒã
ref structåã®ãã©ã¡ãŒã¿ãŒã¯ãå埩åã¡ãœãããŸãã¯asyncã¡ãœããã®åŒæ°ã§ããããŸããã -
refããŒã«ã«ãšref structåã®ããŒã«ã«ã¯ãyield returnã¹ããŒãã¡ã³ããŸãã¯awaitåŒã®æç¹ã§ã³ã³ããã¹ãå ã«ååšã§ããŸããã - ref å代å
¥
e1 = ref e2ã®å Žåãe2ã® ref-safe-context ã¯ãå°ãªããšã ã®e1ãšåãåºãã³ã³ããã¹ãã§ããå¿ èŠããããŸãã - ref return ã¹ããŒãã¡ã³ã
return ref e1ã®å Žåãe1ã® ref-safe ã³ã³ããã¹ãã¯ãå°ãªããšãæ»ãå€ã®ã¿ã«ãªããŸãã
9.7.3 ã¹ã³ãŒã修食å
ã³ã³ããã¹ã ããŒã¯ãŒã scoped ã¯ã倿°ã® ref-safe-context (§9.7.2) ãŸãã¯ã»ãŒã ã³ã³ããã¹ã (§16.8.15) ãå¶éããããã®ä¿®é£ŸåãšããŠäœ¿çšãããŸãã ãã®ä¿®é£Ÿåãååšããã«ã¯ãé¢é£ããã³ãŒãã§å€æ°ã®æå¹æéãå»¶é·ãããªãå¿
èŠããããŸãã
scoped ã¯ãåç
§å€æ° (å€ä»¥å€ã®ãã©ã¡ãŒã¿ãŒãå«ã) ãš ref æ§é äœåã®å€æ°ã«ã®ã¿é©çšãããŸãã
scoped ã¯ããã£ãŒã«ããé
åèŠçŽ ããŸãã¯æ»ãå€ã®åã«ã¯é©çšãããŸããã
次ã®å®£èšãšãã®å®å šãªã³ã³ããã¹ãã«ã€ããŠèããŠã¿ãŸãããã
| ããŒã«ã«å€æ° | ref-safe-context | å®å šãªã³ã³ããã¹ã |
|---|---|---|
Span<int> s |
function-member | caller-context |
scoped Span<int> s |
function-member | function-member |
ref Span<int> s |
caller-context | caller-context |
scoped ref Span<int> s |
function-member | caller-context |
ãã®é¢ä¿ã§ã¯ãå€ ã® ref-safe ã³ã³ããã¹ã ã ã»ãŒã ã³ã³ããã¹ããããåºãããããšã¯ã§ããŸããã
äŸ:
scopedãããŒã«ã«ã®æå¹æéãå¶éããå€åŽã®é¢æ°ããšã¹ã±ãŒãã§ããªãããã«ããæ¹æ³ã瀺ããŸããusing System; class C { static Span<int> Bad() { // Without `scoped`, the safe-context of `s` would be caller-context // because the right-hand side has safe-context of caller-context. // The `scoped` modifier forces the safe-context to function-member, // so `s` cannot be returned. scoped Span<int> s = default; return s; // Error: s has safe-context of function-member } }çµäºãµã³ãã«
äŸ: ãã©ã¡ãŒã¿ãŒã®
scoped refã«ãããã¡ãœããããè¿ãããæ§ç¯ãããref structå€ã«ãã£ãŠãã©ã¡ãŒã¿ãŒããã£ããã£ãããªãããã«ããæ¹æ³ã瀺ããŸããref struct RS { public ref int RefField; public RS(ref int i) { RefField = ref i; } } class C { // `scoped ref` means `value` does not contribute ref-safe-context // to the return value. The `RS` constructor requires a ref argument // with ref-safe-context of caller-context, but `value` only contributes // function-member, so the call is rejected. static RS CreateWithoutCapture(scoped ref int value) => new RS(ref value); }çµäºãµã³ãã«
èŠçŽãããšã2 ã€ã® ref ã®å Žæãæé»çã« scopedãããŸããæ§é äœã€ã³ã¹ã¿ã³ã¹ ã¡ãœããã® this ãã©ã¡ãŒã¿ãŒãšããã¹ãŠã® out ãã©ã¡ãŒã¿ãŒã§ãã
§9.7.2.3 ãåç
§ããŠãã ããã
9.7.4 ãã©ã¡ãŒã¿ãŒã¹ã³ãŒãã®åæ£
ãã©ã¡ãŒã¿ãŒã® scoped 修食å (§9.7.3) ãš [UnscopedRef] 屿§ (§23.5.8) ã¯ããªãŒããŒã©ã€ããã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£
ãããã³ delegate 倿ã«åœ±é¿ããŸãã ãªãŒããŒã©ã€ããã€ã³ã¿ãŒãã§ã€ã¹å®è£
ããŸã㯠delegate 倿ã®ã·ã°ããã£ã¯ã次ã®å ŽåããããŸãã
-
scopedãrefãŸãã¯inãã©ã¡ãŒã¿ãŒã«è¿œå ããŸãã -
scopedåã®ãã©ã¡ãŒã¿ãŒã«ref structã远å ããŸãã -
[UnscopedRef]ãã©ã¡ãŒã¿ãŒããoutãåé€ããŸãã -
[UnscopedRef]åã®refãã©ã¡ãŒã¿ãŒããref structãåé€ããŸãã
ããŒã¹ãšã·ã°ããã£ã®ãªãŒããŒã©ã€ããå®è£
ããŸãã¯å€æã®éã® scoped ãŸã㯠[UnscopedRef] ã«é¢ãããã®ä»ã®éãã¯äžèŽããŸããã
scoped修食åãš[UnscopedRef]屿§ã¯é衚瀺ã«åœ±é¿ããŸããã
ãªãŒããŒããŒãã¯ã scoped ãŸã㯠[UnscopedRef]ã§ã®ã¿ç°ãªããã®ã§ã¯ãããŸããã
äŸ: ãªãŒããŒã©ã€ãã®æå¹ãªã¹ã³ãŒããšç¡å¹ãªã¹ã³ãŒãã®å·®ç°ã次ã«ç€ºããŸãã
using System; class Base { public virtual void M(ref Span<int> x) { } } class Derived : Base { // OK: adds scoped to a ref parameter public override void M(scoped ref Span<int> x) { } } class C { void N(Span<int> x) { } void N(scoped Span<int> x) { } // Error: overloads differ only on scoped }çµäºãµã³ãã«
ECMA C# draft specification