Note
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãµã€ã³ã€ã³ãŸãã¯ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
11.1 å šè¬
ãã¿ãŒã³ã¯ãisæŒç®å (§12.15.12)ãswitch_statement (§13.8.3)ãããã³switch_expression (§12.12) ã§äœ¿çšããŠãåä¿¡ããŒã¿ã®æ¯èŒå¯Ÿè±¡ãšãªãããŒã¿ã®åœ¢ç¶ãèšè¿°ã§ããŸãã ããŒã¿ã®äžéšã ãµããã¿ãŒã³ãšç
§åããŠããã¿ãŒã³ãå
¥ãåã«ããããšãã§ããŸãã
ãã¿ãŒã³ã¯ãããŸããŸãªã³ã³ããã¹ãã®å€ã«å¯ŸããŠãã¹ããããŸãã
- switch_statementã§ã¯ãswitch_labelã®ãã¿ãŒã³ãswitch_statementã®selector_expressionã«å¯ŸããŠãã¹ããããŸãã
- is-pattern æŒç®åã䜿çšãããšãå³åŽã®ãã¿ãŒã³ãå·ŠåŽã®åŒã«å¯ŸããŠãã¹ããããŸãã
- switch_expressionã§ã¯ãswitch_expressionã®å·ŠåŽã«ããåŒã«å¯ŸããŠswitch_expression_armã®ãã¿ãŒã³ããã¹ããããŸãã
- å ¥ãåã«ãªã£ãã³ã³ããã¹ãã§ã¯ã ãµããã¿ãŒã³ã¯ã ãã¿ãŒã³ã®åœ¢åŒã«å¿ããŠãããããã£ããã£ãŒã«ãããŸãã¯ä»ã®å ¥åå€ããååŸãããå€ã«å¯ŸããŠãã¹ããããŸãã
ãã¿ãŒã³ããã¹ããããå€ã ãã¿ãŒã³å ¥åå€ãšåŒã°ããŸãã
ãã¿ãŒã³ Pã¯ãPã§äžèŽããå
¥åå€ãQã®ã¡ã³ããŒã® 1 ã€ã«ãã£ãŠäžèŽããå Žåã«Qäžé£ã®éã¬ãŒã ãã¿ãŒã³ã«ãã£ãŠãµãã¹ã åãããŸãã
switch ã¹ããŒãã¡ã³ã (§13.8.3) ã§ã¯ãã±ãŒã¹ã®ãã¿ãŒã³ãåã®äžé£ã®éã¬ãŒã (§13.8.3) ã±ãŒã¹ã«ãã£ãŠãµãã¹ã ããããšãšã©ãŒã«ãªããŸãã switch åŒ (§12.12) ã§ã¯ãswitch_expression_armã®ãã¿ãŒã³ãåã®äžé£ã®ç¡é²åãªswitch_expression_armãã¿ãŒã³ã«ãã£ãŠãµãã¹ã ããããšããšã©ãŒã«ãªããŸãã
å¯èœãªãã¹ãŠã®å ¥åå€ã«å¯ŸããŠã»ããå ã®ãã¿ãŒã³ãé©çšãããå Žåããã¿ãŒã³ã®ã»ããã¯å®å šã§ãã äžé£ã®ãã¿ãŒã³ãå®å šã§ã¯ãªãããšãå®è£ ã«ãã£ãŠæ€åºããããšãèŠåãçºè¡ãããŸãã
11.2 ãã¿ãŒã³åœ¢åŒ
11.2.1 å šè¬
ãã¿ãŒã³ã«ã¯ã次ã®ããããã®åœ¢åŒããããŸãã
pattern
: logical_pattern
;
primary_pattern
: parenthesized_pattern
| declaration_pattern
| constant_pattern
| var_pattern
| positional_pattern
| property_pattern
| discard_pattern
| type_pattern
| relational_pattern
| list_pattern
| slice_pattern
;
parenthesized_pattern
: '(' pattern ')'
;
å ¥åãconstant_patternãšpositional_patternã®äž¡æ¹ãšããŠæ§æçã«èªèã§ããå Žåã¯ãconstant_patternãéžæããå¿ èŠããããŸãã
泚: ANTLR ã¯ããã¿ãŒã³ã®ä»£ããã«positional_patternããåã«constant_patternã®é åºãåå ã§ãæå®ãããéžæãèªåçã«è¡ããŸãã æ³šé
'(' pattern ')'å®çšŒåã§ã¯ããã¿ãŒã³ããã£ãã§å²ãã§ãlogical_patternã®ããããã䜿çšããŠçµã¿åããããã¿ãŒã³éã®è©äŸ¡é åºãé©çšã§ããŸãã
äžéšã® ãã¿ãŒã³s ã§ã¯ãããŒã«ã«å€æ°ã宣èšãããå¯èœæ§ããããŸãã
åãã¿ãŒã³ ãã©ãŒã ã¯ããã¿ãŒã³ãé©çšã§ããå
¥åå€ã®åã®ã»ãããå®çŸ©ããŸãã ãã¿ãŒã³ Pã¯ãã¿ãŒã³ãäžèŽããå¯èœæ§ã®ããå€ãæã€åã®äžã«Tãããå Žåã«Tåã«é©çšã§ããŸãã
Pãã«é©çšã§ããªãå Žåããã¿ãŒã³TãPåã®ãã¿ãŒã³å
¥åå€ (T) ãšäžèŽããããã«ããã°ã©ã ã«è¡šç€ºãããå Žåãã³ã³ãã€ã«æãšã©ãŒã«ãªããŸãã
äŸ: 次ã®äŸã§ã¯ã
vã®ã³ã³ãã€ã«æã®åãTextReaderãããŠãããããã³ã³ãã€ã«æãšã©ãŒãçæãããŸããTextReaderåã®å€æ°ã¯ãstringãšåç §äºæã®å€ãæã€ããšã¯ãããŸãããTextReader v = Console.In; // compile-time type of 'v' is 'TextReader' if (v is string) // compile-time error { // code assuming v is a string }ãã ãã
vã®ã³ã³ãã€ã«æã®åãobjectãããŠãããããæ¬¡ã§ã¯ã³ã³ãã€ã«æãšã©ãŒã¯çæãããŸãããobjectåã®å€æ°ã¯ãstringãšåç §äºæã®å€ãæã€ããšãã§ããŸããobject v = Console.In; if (v is string s) { // code assuming v is a string }end ã®äŸ
åãã¿ãŒã³ ãã©ãŒã ã¯ããã¿ãŒã³ãå®è¡æã«å€ ç §å å€ã®ã»ãããå®çŸ©ããŸãã
ãã¿ãŒã³ ãããã³ã°äžã®æäœãšå¯äœçšã®è©äŸ¡é åº ( Deconstructã®åŒã³åºãããããã㣠ã¢ã¯ã»ã¹ãããã³ System.Runtime.CompilerServices.ITupleã®ã¡ã³ããŒã®åŒã³åºã) ã¯æå®ãããŠããŸããã
11.2.2 宣èšãã¿ãŒã³
declaration_patternã¯ãå€ãç¹å®ã®åãæã£ãŠããããšããã¹ããããã¹ããæåããå Žåã¯ãå¿ èŠã«å¿ããŠãã®åã®å€æ°ã«å€ãæäŸããããã«äœ¿çšãããŸãã
declaration_pattern
: type simple_designation
;
simple_designation
: discard_designation
| single_variable_designation
;
discard_designation
: '_'
;
single_variable_designation
: identifier
;
discard_designationãšsingle_variable_designationã®äž¡æ¹ã®ä»£æ¿ææ®µãé©çšãããå Žåãsimple_designationãèªèããå Žåã¯ãåè ãéžæããå¿ èŠããããŸãã
泚: ANTLR ã¯ãsimple_designationã®ä»£æ¿ã®é åºã«ãããæå®ãããéžæãèªåçã«è¡ããŸãã æ³šé
unicode æåãšã¹ã±ãŒã ã·ãŒã±ã³ã¹ (§6.4.2) ãå«ãèå¥åã䜿çšããŠåç
§ãããŠããããEscaped_Identifier (§6.4.3) ã§è¡šãããŠããå Žåãé€ããdeclaration_patternã䜿çšããŠãvarãšããååã®åãæã€å€ããã¹ãããããšã¯ã§ããŸããã
äŸ:
varãšããååã®åãæå®ãããšãis-type æ§æã誀ã£ããã¿ãŒã³ãæå¹ãª declaration_pattern ã¹ãã«ã®éããæ¬¡ã«ç€ºããŸãã
is varã³ã³ã¹ãã©ã¯ã (æå®ãªã) 㯠is-type æŒç®å (§12.15.12.1) ã§ããããªãã©ã³ãã®ã©ã³ã¿ã€ã åãvarãã©ããããã¹ãããŸãã#pragma warning disable CS8981 class var { } class C { static bool M(object o) => o is var; // is-type check; o is var (the type) }
is var yããã¿ãŒã³ãšããŠèšè¿°ããããšã¯ãvarãšããååã®åãã¹ã³ãŒãå ã«ããå Žåã®ã³ã³ãã€ã«æãšã©ãŒã§ãã#pragma warning disable CS8981 class var { } class C { static void M(object o) { if (o is var y) { } // error CS8508: 'var' refers to the in-scope type } }Escaped_Identifier (
@var) ãŸã㯠unicode ãšã¹ã±ãŒãã¹ãã« (v\u0061r) ãdeclaration_patternã®åãšããŠäœ¿çšããããšã¯æå¹ã§ãããvarãšããååã®åã®ã€ã³ã¹ã¿ã³ã¹ã«ã®ã¿äžèŽããŸãã#pragma warning disable CS8981 class var { } class C { static void M(object o) { if (o is @var y) { } // declaration_pattern; matches instances of type 'var' if (o is v\u0061r z) { } // declaration_pattern; same type, unicode-escape spelling } }end ã®äŸ
declaration_patternã®åãdynamicããããšã¯ã§ããŸããã
åã null èš±å®¹å€ å (§8.3.12) ãŸã㯠null 蚱容åç §å (§8.9.3) ã®å Žåãã³ã³ãã€ã«æãšã©ãŒã§ãã
å€ã®ã©ã³ã¿ã€ã åã¯ãis-type æŒç®å (§12.15.12.1) ã§æå®ãããã®ãšåãèŠåã䜿çšããŠããã¿ãŒã³å ã®åã«å¯ŸããŠãã¹ããããŸãã ãã¹ããæåãããšããã®å€ãã¿ãŒã³ç §åãããŸãã
泚: is-type åŒ
e is Tãšå®£èšãã¿ãŒã³e is T _ã¯ãäž¡æ¹ãæå¹ãªå Žåã¯åçã§ãã æ³šé
ãã¿ãŒã³å ¥åå€ (§11.1) e ãæå®ãããšã simple_designation ã discard_designationã§ãç Žæ£ (§9.2.9.2) ã瀺ãå Žåã e ã®å€ã¯äœã«ããã€ã³ããããŸããã ãã以å€ã®å Žåã simple_designation ã single_variable_designationã®å Žåã¯ãæå®ãããèå¥åã«ãã£ãŠæå®ãããåã®ããŒã«ã«å€æ° (§9.2.9) ãå°å ¥ãããŸãã ãã®ããŒã«ã«å€æ°ã«ã¯ããã¿ãŒã³ã ããããããšãã«ããã®å€ ãã¿ãŒã³å ¥åå€ã®å€ãå²ãåœãŠãããŸãã
泚:
_å ã®ã®ãã®åŠçã¯ã_ãšããŠèšè¿°ãããã¹ã¿ã³ãã¢ãã³ (§11.2.7) ãšã¯ç°ãªããŸããåŸè ã®å Žåãã¹ã³ãŒãå 宿°ãŸãã¯_ãšããååã®åã¯é衚瀺ã«ãªããŸããã æ³šé
åEã¯ãid 倿ãæé»çãŸãã¯æç€ºçãªåç
§å€æãããã¯ã¹å倿ãããã¯ã¹åè§£é€å€æããŸãã¯ãããžã®æé»çãŸãã¯æç€ºç㪠null 蚱容å€ã®å倿ããŸãã¯TãŸãã¯Eã®ããããããªãŒãã³å (T) ã§ããå Žåã«EåãšTèšãããŸãã
Tåã«ååãä»ãã宣èšãã¿ãŒã³ã¯ãããšäºææ§ã®ãããã¿ãŒã³ã§ãããã¹ãŠã®åE (E) ã«Tã éçãªåTããšäºææ§ã®ãªããã¿ãŒã³å
¥åå€ (E) ãšäžèŽããããã«ãåTãšãã宣èšãã¿ãŒã³ã䜿çšãããŠããå Žåãã³ã³ãã€ã«æãšã©ãŒã§ãã
泚: ãªãŒãã³åã®ãµããŒãã¯ãæ§é äœåãŸãã¯ã¯ã©ã¹åã§ããå¯èœæ§ãããåããã§ãã¯ããå Žåã«æã圹ç«ã¡ãããã¯ã¹åã¯é¿ããå¿ èŠããããŸãã æ³šé
äŸ: 宣èšãã¿ãŒã³ã¯ãåç §åã®å®è¡æã®åãã¹ããå®è¡ããã®ã«åœ¹ç«ã¡ãã€ãã£ãªã ã眮ãæããŸã
var v = expr as Type; if (v != null) { /* code using v */ }å°ãç°¡æœã«
if (expr is Type v) { /* code using v */ }end ã®äŸ
äŸ: 宣èšãã¿ãŒã³ã¯ãnull 蚱容åã®å€ããã¹ãããããã«äœ¿çšã§ããŸããå
Nullable<T>(ãŸãã¯ããã¯ã¹åãããT) ã®å€ã¯ãå€ã null 以å€ã§T2 idT2ãTå ŽåããŸãã¯Tã®åºæ¬åãŸãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã®åãã¿ãŒã³ãšäžèŽããŸãã ããšãã°ãã³ãŒã ãã©ã°ã¡ã³ãåint? x = 3; if (x is int v) { /* code using v */ }
ifã¹ããŒãã¡ã³ãã®æ¡ä»¶ã¯å®è¡æã«trueããã倿°vã¯ãããã¯å ã§3åã®å€intãä¿æããŸãã ãããã¯ã®åŸã倿°vã¯ã¹ã³ãŒãå ã«ãããŸããã確å®ã«ã¯å²ãåœãŠãŸããã end ã®äŸ
11.2.3 宿°ãã¿ãŒã³
constant_patternã¯ããã¿ãŒã³å ¥åå€ (§11.1) ã®å€ãç¹å®ã®å®æ°å€ã«å¯ŸããŠãã¹ãããããã«äœ¿çšãããŸãã
constant_pattern
: constant_expression
;
宿°ãã¿ãŒã³Pã¯ãPã®å®æ°åŒããåTãžã®æé»çãªå€æãããå ŽåããŸãã¯TãSystem.Span<char>ãŸãã¯System.ReadOnlySpan<char>ã§ãããPã®å®æ°åŒãåstringã§ãããnullãªãã©ã«ã§ãªãå Žåã«ãåTã«é©çšãããŸãã
宿°ãã¿ãŒã³ Pã®å Žåããã® å€æãããå€ ã¯
- ãã¿ãŒã³å ¥åå€ã®åãæŽæ°åãŸãã¯åæåã®å Žåããã¿ãŒã³ã®å®æ°å€ã¯ãã®åã«å€æãããŸããç¶ãç¡ãã°
- ãã¿ãŒã³å ¥åå€ã®åãæŽæ°åãŸãã¯åæåã® null 蚱容ããŒãžã§ã³ã§ããå Žåããã¿ãŒã³ã®å®æ°å€ã¯åºã«ãªãåã«å€æãããŸããç¶ãç¡ãã°
- ãã¿ãŒã³ã®å®æ°å€ã®å€ã
ãã¿ãŒã³å
¥åå€ãe倿ãããå€ãæã€å®æ°ãã¿ãŒã³Pvã
-
eãæŽæ°åãŸãã¯åæåããŸãã¯ããããã® null 蚱容圢åŒãæã¡ãv ãæŽæ°åãæã€å Žåããã¿ãŒã³
PãããåŒã®çµæãe == vå Žåã¯å€trueããã以å€ã®å Žå -
e ã
System.Span<char>åãŸãã¯System.ReadOnlySpan<char>åã§ãv ã宿°æååã§ãv ã«å®æ°å€ãnullã§ãªãå ŽåãSystem.MemoryExtensions.SequenceEqual<char>(e, System.MemoryExtensions.AsSpan(v))ãtrueãè¿ãå Žåããã¿ãŒã³ã¯ e ã®å€ãšäžèŽPããã以å€ã®å Žå -
Pããè¿ãå Žåã¯å€ãäžèŽããŸãã
äŸ: 次ã®ã¡ãœããã®
switchã¹ããŒãã¡ã³ãã§ã¯ãã±ãŒã¹ ã©ãã«ã« 5 ã€ã®å®æ°ãã¿ãŒã³ã䜿çšãããŸããstatic decimal GetGroupTicketPrice(int visitorCount) { switch (visitorCount) { case 1: return 12.0m; case 2: return 20.0m; case 3: return 27.0m; case 4: return 32.0m; case 0: return 0.0m; default: throw new ArgumentException(...); } }end ã®äŸ
11.2.4 Var ãã¿ãŒã³
var_patternmatchesãã¹ãŠã®å€ã ã€ãŸãã var_pattern ã䜿çšãããã¿ãŒã³ ãããã³ã°æäœã¯åžžã«æåããŸãã
var_patternã¯ãã¹ãŠã®åã«é©çšã§ããŸãã
var
ãšããååã®ã¹ã³ãŒãå
ã®åãããå Žåãvar_patternã¯äœ¿çšã§ããŸããã
泚:
@varãªã©ã®ãšã¹ã±ãŒããããèå¥åããŸãã¯v\u0061rãªã©ã® unicode ãšã¹ã±ãŒãã¹ãã«ã¯ãdeclaration_patternå ã®ã¹ã³ãŒãå ã®åã«ååãä»ããŸãããvar_patternã®ã³ã³ããã¹ãvarããŒã¯ã³ã®ã¹ãã«ãæå®ããŸããã ãããã£ãŠã@var yãšv\u0061r yã®ãã¿ãŒã³ã¯ãã©ã³ã¿ã€ã åãvarãšããååã®ã¹ã³ãŒãå åãšäºææ§ãããå€ã«ã®ã¿äžèŽããdeclaration_pattern s (§11.2.2) ã§ãã æ³šé
var_pattern
: 'var' designation
;
designation
: simple_designation
| tuple_designation
;
tuple_designation
: '(' designations? ')'
;
designations
: designation (',' designation)*
;
ãã¿ãŒã³å ¥åå€ (§11.1) e ãæå®ãããšãæå®ãdiscard_designationå Žåã¯ç Žæ£ (§9.2.9.2) ã衚ããe ã®å€ã¯äœã«ããã€ã³ããããŸããã (ãã®ååãæã€å®£èšããã倿°ã¯ããã®æç¹ã§ã¹ã³ãŒãå ã«ããå ŽåããããŸããããã®ã³ã³ããã¹ãã§ã¯ãã®ååä»ã倿°ã¯è¡šç€ºãããŸãã)ããã以å€ã®å Žåãæå®ãsingle_variable_designationå Žåãå®è¡æã« e ã®å€ã¯ããã®ååã®æ°ããå°å ¥ãããããŒã«ã«å€æ° (§9.2.9) ã«ãã€ã³ãããããã®å㯠e ã®éçåã§ããããã¿ãŒã³å ¥åå€ã¯ãã®ããŒã«ã«å€æ°ã«å²ãåœãŠãããŸãã
æå®ãtuple_designationã®å Žåããã¿ãŒã³ã¯ãã©ãŒã ãã¶ã€ã³ã®(var (§11.2.5) ã«çžåœããŸãã
)æå®ã¯ãtuple_designationå
ã§èŠã€ãã£ããã®ã§ãã ããšãã°ããã¿ãŒã³ var (x, (y, z)) 㯠(var x, (var y, var z))ãšåãã§ãã
11.2.5 äœçœ®ãã¿ãŒã³
positional_patternã¯ãå
¥åå€ãnullãããŠããªãããšã確èªããããããå€ã®ã·ãŒã±ã³ã¹ãæœåºããæœåºãããåå€ã察å¿ãããµããã¿ãŒã³ãšç
§åããŸãã å€ã¯ã3 ã€ã®æ¹æ³ã®ããããã§æœåºãããŸããå
¥åãã¿ãã«ãšããŠæ±ããã Deconstruct ã¡ãœãããåŒã³åºããã System.Runtime.CompilerServices.ITupleã䜿çšããŠå
¥åã«ã€ã³ããã¯ã¹ãä»ããŸãã
泚: ããã§ã®
Deconstructã®äœ¿çšã¯ã §12.7 ã§å®çŸ©ãããŠãããœãŒã¹ ã¬ãã«ã®åè§£å€æãšã¯ç°ãªããŸãã æ³šé
positional_pattern
: type? '(' subpatterns? ')' property_subpattern? simple_designation?
;
subpatterns
: subpattern (',' subpattern)*
;
subpattern
: pattern
| subpattern_name ':' pattern
;
subpattern_name
: identifier
| subpattern_name '.' identifier
;
å
¥åå€ããã¿ãŒã³ å(subpatterns)ã«äžèŽããå Žåãã¡ãœãã㯠å ãæ€çŽ¢ã㊠Deconstruct ã®ã¢ã¯ã»ã¹å¯èœãªå®£èšãæ€çŽ¢ããåè§£å²ãåœãŠ (§12.24.3) ãšåãèŠåã䜿çšããŠãããã®äžãã 1 ã€ãéžæããããšã«ãã£ãŠéžæãããŸãã
å
¥åãconstant_patternãšpositional_patternã®äž¡æ¹ãšããŠæ§æçã«èªèã§ããå Žåã¯ãconstant_patternãéžæããå¿
èŠããããŸãã
泚: ã¿ãã« ãªãã©ã«ã¯ã亀æå¯èœã§ã¯ãªãããã€ãã®ç°ãªã圢åŒã®ãã¿ãŒã³ã§ç §åã§ããŸãã
(int, int) xã¯ãå(int, int)ãšsimple_designationxãæã€declaration_patternã§ããvar (x, y)㯠ãtuple_designation ãæã€ var_patternã§ãã(int x, int y)㯠positional_patternã§ãã(int, int) (x, y)ã¯æå¹ãªãã¿ãŒã³ã§ã¯ãããŸãããæ³šé
ãªã¹ãå ã®ãã¿ãŒã³ãšäžèŽããå€ãæœåºããã«ã¯ã
- ã¿ãã« ãã©ãŒã ã åãçç¥ããå ¥åå€ã®éçåãã¿ãã«å (§8.3.11) ã®å ŽåããŸãã¯å ¥åå€ãã¿ãã« ãªãã©ã« (§12.8.6) ã®å Žåã¯ããã®ã±ãŒã¹ãé©çšãããŸãã n ããã®ã¿ãã«åã®ã¢ãªãã£ãšçãããªãå Žåãã³ã³ãã€ã«æãšã©ãŒã«ãªããŸãã å®è¡æã«ãåã¿ãã«èŠçŽ ã¯å¯Ÿå¿ãã ãµããã¿ãŒã³ãšç §åãããŸãããããã®ãã¹ãŠãæåããå ŽåãäžèŽã¯æåããŸãã ãµããã¿ãŒã³ã«èå¥åãããå Žåããã®èå¥åã¯ã¿ãã«åã®å¯Ÿå¿ããäœçœ®ã«ã¿ãã«èŠçŽ ã®ååãä»ããŸãã
- ãã©ãŒã ãåè§£ããŸãã ãã以å€ã®å Žåãããããã® å ãååšãããã å ãçç¥ãããå
¥åå€ã®éçåã«ã¢ã¯ã»ã¹å¯èœãª
Deconstructã¡ãœãã (§12.7) ãå«ãŸããŠããå Žåã¯ããã®ã±ãŒã¹ãé©çšãããŸãã åãååšããå Žå㯠D ãåã«ããããã以å€ã®å Žåã¯ãD ãå ¥åå€ã®éçãªåã«ããããšãã§ããŸããDeconstructã¡ãœããã¯ãåè§£å²ãåœãŠ (§12.24.3) ãšåããªãŒããŒããŒã解決èŠåã䜿çšã㊠D ããéžæãããŸããoutãã©ã¡ãŒã¿ãŒã®æ°ã n ã«çãããšãã远å èŠä»¶ããããŸãããã®ãããªã¡ãœãããååšããªãå Žåã¯ã³ã³ãã€ã«æãšã©ãŒã§ãã åãååšããå Žåãå ¥åå€ã®éçåãåãšãã¿ãŒã³äºææ§ããªã (§11.2.2) å Žåãã³ã³ãã€ã«æãšã©ãŒã«ãªããŸããå®è¡æã«å ¥åå€ãåã«å¯ŸããŠãã¹ãããããã®ãã¹ãã倱æããå Žåãäœçœ®ãã¿ãŒã³ã®äžèŽã¯å€±æããŸãã ãã以å€ã®å Žåãå ¥åå€ã¯ D ã«å€æãããéžæããDeconstructã¡ãœããã¯ãoutãã©ã¡ãŒã¿ãŒãåãåãæ°ãã倿°ã§åŒã³åºãããŸãã åä¿¡ããåå€ã¯å¯Ÿå¿ãã ãµããã¿ãŒã³ãšç §åãããããããã¹ãŠãæåããå Žåã¯äžèŽãæåããŸãã ãµããã¿ãŒã³ã«èå¥åãããå Žåããã®èå¥åã¯ãã©ã¡ãŒã¿ãŒã«Deconstructã®å¯Ÿå¿ããäœçœ®ã«ååãä»ããŸãã - ITuple ãã©ãŒã ã ãã以å€ã®å Žåã å ãçç¥ãããšã ãµããã¿ãŒã³ ã« èå¥åããªããå
¥åå€ã®éçãªåã
objectãSystem.Runtime.CompilerServices.ITupleããŸãã¯System.Runtime.CompilerServices.ITupleãžã®æé»çãªåç §å€æãæã€åã§ããå Žåããã®ã±ãŒã¹ãé©çšãããŸãã å®è¡æã«ãå ¥åå€ãnullã®System.Runtime.CompilerServices.ITuple以å€ã®ã€ã³ã¹ã¿ã³ã¹ã§ããããšããã¹ããããŸãããã®ãã¹ãã倱æããå Žåãäœçœ®æå®ãã¿ãŒã³ã®äžèŽã¯å€±æããŸãã ãã以å€ã®å Žåãå€ã®Lengthããããã£ãèªã¿åããã n ãšçãããªãå Žåãäœçœ®æå®ãã¿ãŒã³ã®äžèŽã¯å€±æããŸãã ãã以å€ã®å Žåã¯ã i ã 1 ãã n ã®å i ã«ã€ããŠã i â 1 ã§å ¥åå€ã®ã€ã³ããã¯ã¹ãäœæããå€ã i çªç®ã® ãµããã¿ãŒã³ãšç §åãããããããã¹ãŠãæåããå Žåã«äžèŽãæåããŸãã - ãã以å€ã®å Žåã倧æåãšå°æåã¯é©çšãããŸããã positional_pattern ã¯ã³ã³ãã€ã«æãšã©ãŒã§ãã
å®è¡æã«ãµããã¿ãŒã³ãäžèŽããé åºã¯æå®ãããŠããããäžèŽã倱æããŠããã¹ãŠã®ãµããã¿ãŒã³ãšã®äžèŽã詊è¡ãããªãå ŽåããããŸãã
äŸ: ããã§ã¯ãåŒã®çµæãåè§£ããçµæã®å€ã察å¿ããå ¥ãåã«ãªã£ããã¿ãŒã³ãšç §åããŸãã
static string Classify(Point point) => point switch { (0, 0) => "Origin", (1, 0) => "positive X basis end", (0, 1) => "positive Y basis end", _ => "Just a point", }; public readonly struct Point { public int X { get; } public int Y { get; } public Point(int x, int y) => (X, Y) = (x, y); public void Deconstruct(out int x, out int y) => (x, y) = (X, Y); }end ã®äŸ
äŸ: ã¿ãã«èŠçŽ ãšåè§£ãã©ã¡ãŒã¿ãŒã®ååã¯ã次ã®ããã«äœçœ®æå®ãã¿ãŒã³ã§äœ¿çšã§ããŸãã
var numbers = new List<int> { 10, 20, 30 }; if (SumAndAverage(numbers) is (Sum: var sum, Average: var average)) { Console.WriteLine($"Sum of [{string.Join(" ", numbers)}] is {sum}; average is {average}"); } else { // Note: sum and average are in scope here, but not definitely assigned Console.WriteLine("No numbers provided to compute sum and average."); } static (double Sum, double Average)? SumAndAverage(IEnumerable<int> numbers) { int sum = 0; int count = 0; foreach (int number in numbers) { sum += number; count++; } return count == 0 ? null : (sum, sum / count); }çæãããåºåã¯æ¬¡ã®ãšããã§ãã
Sum of [10 20 30] is 60; average is 20end ã®äŸ
11.2.6 ãããã㣠ãã¿ãŒã³
property_patternã¯ãå
¥åå€ãnullãããŠããªãããšã確èªããã¢ã¯ã»ã¹å¯èœãªããããã£ãŸãã¯ãã£ãŒã«ãã䜿çšããŠæœåºãããå€ãšååž°çã«äžèŽããŸãã
property_pattern
: type? property_subpattern simple_designation?
;
property_subpattern
: '{' '}'
| '{' subpatterns ','? '}'
;
property_patternã®ãµããã¿ãŒã³ã«subpattern_nameãå«ãŸããŠããªãå Žåã¯ãšã©ãŒã§ãã
åã null èš±å®¹å€ å (§8.3.12) ãŸã㯠null 蚱容åç §å (§8.9.3) ã®å Žåãã³ã³ãã€ã«æãšã©ãŒã§ãã
泚: null ãã§ã㯠ãã¿ãŒã³ã¯ãåçŽãªãããã㣠ãã¿ãŒã³ããé€å€ãããŸãã æåå
sã null 以å€ãã©ããã確èªããã«ã¯ã次ã®ããããã®åœ¢åŒãèšè¿°ã§ããŸãã#nullable enable string s = "abc"; if (s is object o) ... // o is of type object if (s is string x1) ... // x1 is of type string if (s is {} x2) ... // x2 is of type string if (s is {}) ...
x2ã宣èšããäŸã¯ã倿°åãæšè«ãããšããç¹ã§if (s is var x2)ã«äŒŒãŠããŸããããããã㣠ãã¿ãŒã³ã§ã¯ãx2ã null 以å€ã§ããããšãä¿èšŒãããŸãã æ³šé
åŒ e ããã¿ãŒã³å{subpatterns} ã«äžèŽãããšãåŒ e ãåã«ãã£ãŠæå®ãããå T ãšãã¿ãŒã³äºææ§ããªã (§11.2.2) å Žåãã³ã³ãã€ã«æãšã©ãŒã«ãªããŸãã åãååšããªãå Žåãå㯠e ã®éçåã§ãããšèŠãªãããŸãã
ãµããã¿ãŒã³ã®å·ŠåŽã«è¡šç€ºãããåsubpattern_nameã¯ãã¢ã¯ã»ã¹å¯èœãªèªã¿åãå¯èœãªããããã£ãŸã㯠T ãã£ãŒã«ããæå®ããå¿
èŠããããŸããproperty_patternã®simple_designationãååšããå Žåã¯ãT åã®ãã¿ãŒã³å€æ°ã宣èšããŸãã
å®è¡æã«ãåŒã¯ T ã«å¯ŸããŠãã¹ããããŸããããã倱æããå Žåããããã㣠ãã¿ãŒã³ã®äžèŽã¯å€±æããçµæã¯ falseã æåããå Žåãå property_subpattern ãã£ãŒã«ããŸãã¯ããããã£ãèªã¿åããããã®å€ã察å¿ãããã¿ãŒã³ãšäžèŽããŸãã äžèŽå
šäœã®çµæã¯ããããã®ããããã®çµæãfalseãããå Žåã«ã®ã¿falseãããŸãã ãµããã¿ãŒã³ãäžèŽããé åºã¯æå®ãããŠãããã倱æããäžèŽã§ã¯å®è¡æã«ãã¹ãŠã®ãµããã¿ãŒã³ããã¹ããããªãå ŽåããããŸãã äžèŽãæåããproperty_patternã®simple_designationãsingle_variable_designationã®å Žåã宣èšããã倿°ã«ã¯äžèŽããå€ãå²ãåœãŠãããŸãã
property_patternã¯ãå¿ååãšã®ãã¿ãŒã³ãããã³ã°ã«äœ¿çšã§ããŸãã
property_subpatternã¯ãå
¥ãåã«ãªã£ãã¡ã³ããŒãåç
§ã§ããŸãã ãã®ãããªå Žåãåååæ€çŽ¢ã®åä¿¡åŽã¯ãproperty_patternã®å
¥åã®çš®é¡ããå§ãŸããåã®ã¡ã³ã㌠Tâ ã®åã§ãã
T ã null 蚱容åã®å ŽåãTâ ã¯ãã®åºã«ãªãåã§ããããã以å€ã®å Žå Tâ 㯠T ãšçãããªããŸããããšãã°ããã©ãŒã { Prop1.Prop2: pattern }ã®ãã¿ãŒã³ã¯ã{ Prop1: { Prop2: pattern } }ãšãŸã£ããåãã§ãã
泚: ããã«ã¯ãT ã null 蚱容å€åãŸãã¯åç §åã§ããå Žåã® null ãã§ãã¯ãå«ãŸããŸãã ãã® null ãã§ãã¯ã¯ã䜿çšã§ããå ¥ãåã«ãªã£ãããããã£ã T ã§ã¯ãªã Tâã®ããããã£ã§ããããšãæå³ããŸããç¹°ãè¿ãã¡ã³ã㌠ãã¹ãèš±å¯ãããããããã¿ãŒã³ ãããã³ã°ã®ã³ã³ãã€ã«ã§ã¯ããã¿ãŒã³ã®äžè¬çãªéšåãå©çšã§ããŸãã æ³šé
äŸ:
var o = ...; if (o is string { Length: 5 } s) ...end ã®äŸ
äŸ: 次ã®ããã«ãå®è¡æã®åãã§ãã¯ãšå€æ°å®£èšããããã㣠ãã¿ãŒã³ã«è¿œå ã§ããŸãã
Console.WriteLine(TakeFive("Hello, world!")); // output: Hello Console.WriteLine(TakeFive("Hi!")); // output: Hi! Console.WriteLine(TakeFive(new[] { '1', '2', '3', '4', '5', '6', '7' })); // output: 12345 Console.WriteLine(TakeFive(new[] { 'a', 'b', 'c' })); // output: abc static string TakeFive(object input) => input switch { string { Length: >= 5 } s => s.Substring(0, 5), string s => s, ICollection<char> { Count: >= 5 } symbols => new string(symbols.Take(5).ToArray()), ICollection<char> symbols => new string(symbols.ToArray()), null => throw new ArgumentNullException(nameof(input)), _ => throw new ArgumentException("Not supported input type."), };çæãããåºåã¯æ¬¡ã®ãšããã§ãã
Hello Hi! 12345 abcend ã®äŸ
11.2.7 ç Žæ£ãã¿ãŒã³
ãã¹ãŠã®åŒãç Žæ£ãã¿ãŒã³ãšäžèŽãããã®çµæãåŒã®å€ãç Žæ£ãããŸãã
discard_pattern
: '_'
;
æ§æã³ã³ããã¹ãã§ãã¿ãŒã³ãèš±å¯ãããŠããå ŽåãããŒã¯ã³_ãã¢ã¯ã»ã¹å¯èœãªå®æ°ãŸãã¯åã«å¯Ÿããsimple_name (§12.8.4) ãšããŠè§£æ±ºãããå Žåã_ã¯discard_patternãšããŠæ±ãããŸããã ãã®ä»£ããã«ïŒ
-
_ã¢ã¯ã»ã¹å¯èœãªå®æ°ã«è§£æ±ºãããå Žåã_ã¯å®æ°åŒããã®å®æ°ã§ããconstant_pattern (§11.2.3) ãšããŠè§£éãããŸãã -
_ãåã«è§£æ±ºãããå ŽåãisæŒç®åã®å³åŽã§ã¯ãã³ã³ã¹ãã©ã¯ã relational_expressionis _ã¯ãã®åã«å¯Ÿãã is-type æŒç®å (§12.15.12.1) ãã¹ããšããŠè§£éãããŸãã ãã¿ãŒã³ãèªãããã®ä»ã®æ§æã³ã³ããã¹ãã§ã¯ãåã«è§£æ±ºãããã¢_èªäœã¯æå¹ãªãã¿ãŒã³ã§ã¯ãããŸããããã ãã_ã¯ãdeclaration_patternã®å (_ xãªã©) ãšããŠããŸãã¯åã«æç€ºçã«ååãä»ããä»ã®ãã¿ãŒã³ 圢åŒãšããŠè¡šç€ºãããå ŽåããããŸãã
ãã®èŠåã¯ãç Žæ£ãã¿ãŒã³ãå°å
¥ããåã«ã _ ãåãŸãã¯èå¥åãšããŠå®çŸ©ããã³ãŒããšã®äžäœäºææ§ãç¶æããŸãã
_ã¢ã¯ã»ã¹å¯èœãªå®æ°ãŸãã¯å (ããŒã«ã«å€æ°ããã©ã¡ãŒã¿ãŒããã£ãŒã«ããã¡ãœãããªã©) 以å€ã«è§£æ±ºãããå Žåãã«ãŒã«ã¯é©çšãããã_ã¯discard_patternã®ãŸãŸã§ãã
泚: ããã¯
varã®ã®èŠåã«äŒŒãŠããŸãããã¹ã³ãŒãå 宿°ãŸãã¯å_ã®å Žåã_ããšã©ãŒãçæããã®ã§ã¯ãªãããã®å®£èšãžã®åç §ãšããŠè§£éãããç¹ãç°ãªããŸãã æ³šé
äžèšã®èŠåãé©çšããåŸããããŒã¯ã³ _ããŸã discard_patternã§ããå Žåããã®discard_patternããã©ãŒã relational_expressionãã¿ãŒã³ã®iså
šäœã®ãã¿ãŒã³ãšããŠããŸãã¯switch_labelã®ãã¿ãŒã³å
šäœãšããŠè¡šç€ºãããã³ã³ãã€ã«æãšã©ãŒã«ãªããŸãã ãã ããdiscard_patternã¯å€åŽã®ãã¿ãŒã³ã®ãµããã¿ãŒã³ãšããŠè¡šç€ºãããå ŽåããããŸã (ããšãã°ãpositional_patternãŸãã¯property_patternã®ãµããã¿ãŒã³ãšããŠ)ã
泚: ãã®ãããªå Žåã¯ãä»»æã®åŒãšäžèŽãããããã«ãç Žæ£ã䜿çšããŸãã æ³šé
äŸ:
Console.WriteLine(GetDiscountInPercent(DayOfWeek.Friday)); Console.WriteLine(GetDiscountInPercent(null)); Console.WriteLine(GetDiscountInPercent((DayOfWeek)10)); static decimal GetDiscountInPercent(DayOfWeek? dayOfWeek) => dayOfWeek switch { DayOfWeek.Monday => 0.5m, DayOfWeek.Tuesday => 12.5m, DayOfWeek.Wednesday => 7.5m, DayOfWeek.Thursday => 12.5m, DayOfWeek.Friday => 5.0m, DayOfWeek.Saturday => 2.5m, DayOfWeek.Sunday => 2.0m, _ => 0.0m, };çæãããåºåã¯æ¬¡ã®ãšããã§ãã
5.0 0.0 0.0ããã§ã¯ãç Žæ£ãã¿ãŒã³ã䜿çšããŠã
nullãšãDayOfWeekåæäœã®å¯Ÿå¿ããã¡ã³ããŒãæããªãæŽæ°å€ãåŠçããŸãã ããã«ãããswitchåŒã䜿çšå¯èœãªãã¹ãŠã®å ¥åå€ãåŠçããããšãä¿èšŒãããŸãã end ã®äŸ
äŸ:
_ãšããååã®ã¹ã³ãŒãå 宿°ã«ãã£ãŠã_åŒå ã®switcharm ã®è§£éãã©ã®ããã«å€æŽããããã瀺ããŸããWithoutUnderscoreã§ã¯ã_ã¢ãŒã ã¯discard_patternã§ãããä»»æã®å€ãšäžèŽããŸããWithUnderscoreã§ã¯ãã¹ã³ãŒãå 宿°_ã«ããã_arm ã¯0ã«ã®ã¿äžèŽããconstant_patternãšããŠè§£éãããŸããstatic string WithoutUnderscore(int n) => n switch { 1 => "one", _ => "other", }; static string WithUnderscore(int n) { const int _ = 0; return n switch { 1 => "one", _ => "zero", var x => "other: " + x, }; }end ã®äŸ
11.2.8 åãã¿ãŒã³
type_patternã¯ããã¿ãŒã³å ¥åå€ (§11.1) ã«ç¹å®ã®åãããããšããã¹ãããããã«äœ¿çšãããŸãã
type_pattern
: type
;
åTã«ååãä»ããåãã¿ãŒã³ã¯ããE (E) ãšäºææ§ã®ãããã¹ãŠã®åTã«é©çšã§ããŸãã
å€ã®ã©ã³ã¿ã€ã åã¯ãis-type æŒç®å (§12.15.12.1) ã§æå®ãããã®ãšåãèŠåã䜿çšããŠåã«å¯ŸããŠãã¹ããããŸãã ãã¹ããæåããå Žåããã¿ãŒã³ã¯ãã®å€ãšäžèŽããŸãã åã null 蚱容 å ã®å Žåã¯ã³ã³ãã€ã«æãšã©ãŒã§ãã ãã®ãã¿ãŒã³ ãã©ãŒã ã¯ã null å€ãšäžèŽããŸããã
11.2.9 ãªã¬ãŒã·ã§ãã« ãã¿ãŒã³
relational_patternã¯ããã¿ãŒã³å ¥åå€ (§11.1) ã宿°å€ã«å¯ŸããŠãªã¬ãŒã·ã§ãã«ã«ãã¹ãããããã«äœ¿çšãããŸãã
relational_pattern
: '<' relational_expression
| '<=' relational_expression
| '>' relational_expression
| '>=' relational_expression
;
宿°å€ã«è©äŸ¡ããã«ã¯ãrelational_patternå ã®relational_expressionãå¿ èŠã§ãã
ãªã¬ãŒã·ã§ãã« ãã¿ãŒã³ã¯ãé¢ä¿æŒç®åã®<ããµããŒãããŸãã <=ã>ã>=ãsbyteãbyteãshortãushortãintãuintãlongãulongãcharãfloatãdoubleãåæåã®äž¡æ¹ã®ãªãã©ã³ãã䜿çšããŠããã®ãããªäºé
é¢ä¿æŒç®åããµããŒããããã¹ãŠã®çµã¿èŸŒã¿åã«decimalãnintãããã³nuintããŸãã
relational_patternã¯ãé©åãªçµã¿èŸŒã¿ã®äºé
é¢ä¿æŒç®åãåã®äž¡æ¹ã®ãªãã©ã³ãã§å®çŸ©ãããŠããå ŽåããŸãã¯æç€ºç㪠null èš±å®¹å€æãŸãã¯ããã¯ã¹åè§£é€å€æãTãã宿°åŒã®åã«ååšããå Žåã«ãåTã«Tã§ããŸãã
åŒã double.NaNã float.NaNããŸã㯠null 宿°ãšè©äŸ¡ãããå Žåãã³ã³ãã€ã«æãšã©ãŒã«ãªããŸãã
å
¥åå€ã«ãé©åãªçµã¿èŸŒã¿ã®äºé
é¢ä¿æŒç®åãå®çŸ©ãããŠããåãããå Žåããã®æŒç®åã®è©äŸ¡ã¯ãªã¬ãŒã·ã§ãã« ãã¿ãŒã³ã®æå³ãšèŠãªãããŸãã ãã以å€ã®å Žåãæç€ºç㪠null èš±å®¹å€æãŸãã¯ããã¯ã¹åè§£é€å€æã䜿çšããŠãå
¥åå€ã宿°åŒã®åã«å€æãããŸãã ãã®ãããªå€æãååšããªãå Žåãã³ã³ãã€ã«æãšã©ãŒãšãªããŸãã 倿ã倱æããå Žåããã¿ãŒã³ã¯äžèŽããªããšèŠãªãããŸãã 倿ãæåããå Žåããã¿ãŒã³ ãããã³ã°æäœã®çµæã¯ã倿ãããå
¥å e «op» v åŒãè©äŸ¡ããçµæã§ããããã§ã e ã¯å€æãããå
¥åã«op» ã¯é¢ä¿æŒç®åã v ã¯å®æ°åŒã§ãã
äŸ:
Console.WriteLine(Classify(13)); Console.WriteLine(Classify(double.NaN)); Console.WriteLine(Classify(2.4)); static string Classify(double measurement) => measurement switch { < -4.0 => "Too low", > 10.0 => "Too high", double.NaN => "Unknown", _ => "Acceptable", };çæãããåºåã¯æ¬¡ã®ãšããã§ãã
Too high Unknown Acceptableend ã®äŸ
11.2.10 è«çãã¿ãŒã³
logical_patternã¯ããã¿ãŒã³äžèŽã®çµæãåŠå®ããããçµå (and) ãŸãã¯çµå (or) ã䜿çšããŠè€æ°ã®ãã¿ãŒã³äžèŽã®çµæãçµåãããããããã«äœ¿çšãããŸãã
logical_pattern
: disjunctive_pattern
;
disjunctive_pattern
: disjunctive_pattern 'or' conjunctive_pattern
| conjunctive_pattern
;
conjunctive_pattern
: conjunctive_pattern 'and' negated_pattern
| negated_pattern
;
negated_pattern
: 'not' negated_pattern
| primary_pattern
;
notã andãããã³ or ã¯ããŸãšã㊠ãã¿ãŒã³æŒç®åãšåŒã°ããŸãã
negated_patternã¯ãåŠå®ããããã¿ãŒã³ãäžèŽããªãå Žåã«äžèŽãããã®éãäžèŽããŸãã
conjunctive_patternã§ã¯ãäž¡æ¹ã®ãã¿ãŒã³ãäžèŽããå¿
èŠããããŸãã
disjunctive_patternã«ã¯ãããããã®ãã¿ãŒã³ãäžèŽããå¿
èŠããããŸãã 察å¿ããèšèªæŒç®åã && ã ||ãšã¯ç°ãªãã and ãš or ã¯ã·ã§ãŒããµãŒãããæŒç®å ã§ã¯ãããŸãã ã
ããã¯ããã¿ãŒã³å€æ°ã not ãŸã㯠or ãã¿ãŒã³æŒç®åã®äžã§å®£èšãããã³ã³ãã€ã«æãšã©ãŒã§ãã
泚:
notãorããã¿ãŒã³å€æ°ã«å¯ŸããŠæç¢ºãªä»£å ¥ãçæã§ããªãããããããã®äœçœ®ã§å®£èšããã®ã¯ãšã©ãŒã§ãã æ³šé
conjunctive_patternã§ã¯ã2 çªç®ã®ãã¿ãŒã³ã®å
¥ååã¯ãã®æåã®ãã¿ãŒã³ã®andãŸããŸãã ãã¿ãŒã³ ã®Pã¯ã次ã®ããã«å®çŸ©ãããŸãã
-
Pãåãã¿ãŒã³ã®å Žåãçž®å°ãããåã¯åãã¿ãŒã³ã®åã§ãã - ãã以å€ã®å Žåã
Pã宣èšãã¿ãŒã³ã®å Žåã çž®å°ãããå ã¯å®£èšãã¿ãŒã³ã®åã§ãã - ãã以å€ã®å Žåã
Pãæç€ºçãªåãæäŸããååž°ãã¿ãŒã³ã§ããå Žåã çž®å°ãããåã¯ãã®å ã«ãªããŸãã - ãã以å€ã®å Žåã
Pãpositional_pattern (ITuple) ã®ã®èŠåã䜿çšããŠç §åãããå Žåãçž®å°ãããåã¯åSystem.ITupleã - ãã以å€ã®å Žåã
Pã宿°ã null 宿°ã§ã¯ãªããåŒãå ¥ååãžã®å®æ°åŒå€æãæããªã宿°ãã¿ãŒã³ã®å Žåãçž®å°ãããåã¯å®æ°ã®åã«ãªããŸãã - ãã以å€ã®å Žåã
Pãã宿°åŒãå ¥ååãžã®å®æ°åŒå€æãæããªããªã¬ãŒã·ã§ãã« ãã¿ãŒã³ã®å Žåãçž®å°ãããåã¯å®æ°ã®åã«ãªããŸãã - ãã以å€ã®å Žåã
Pãorãã¿ãŒã³ã®å Žåã ãã®ãããªå ±éå ãååšããå Žåã çž®å°ãããå ã¯ãµããã¿ãŒã³ã®çž®å°åã®å ±éåã«ãªããŸãã ãã®ãããå ±éåã¢ã«ãŽãªãºã ã§ã¯ãIDãããã¯ã¹åãããã³æé»çãªåç §å€æã®ã¿ãèæ ®ãããorãã¿ãŒã³ã®ã·ãŒã±ã³ã¹ã®ãã¹ãŠã®ãµããã¿ãŒã³ãèæ ®ãããŸã (ãã£ãã§ä¿è·ããããã¿ãŒã³ã¯ç¡èŠãããŸã)ã - ãã以å€ã®å Žåã
Pãandãã¿ãŒã³ã®å Žåã çž®å°ãããå ã¯å³ã®ãã¿ãŒã³ã® çãå ã«ãªããŸãã ãŸããå·Šãã¿ãŒã³ã® çãã¿ã€ã ã¯ãå³ãã¿ãŒã³ã® å ¥åã¿ã€ã ã§ããã - ãã以å€ã®å Žåã
Pã¯Pã®å ¥ååã§ãã
泚: ææ³ã§ç€ºãããŠããããã«ã
notã¯andãããåªå ãããorãããåªå ãããŸãã ããã¯ããã£ãã䜿çšããŠæç€ºçã«æå®ãŸãã¯ãªãŒããŒã©ã€ãã§ããŸãã æ³šé
ãã¿ãŒã³ãisã®å³åŽã«è¡šç€ºãããå Žåããã¿ãŒã³ã®ç¯å²ã¯ææ³ã«ãã£ãŠæ±ºãŸããŸãããã®çµæããã¿ãŒã³æŒç®åandãorãããã³ãã¿ãŒã³å
ã®notã¯ããã¿ãŒã³ã®å€åŽã®è«çæŒç®å&&ã||ãããã³!ãããå³å¯ã«ãã€ã³ããããŸãã
äŸ:
Console.WriteLine(Classify(13)); Console.WriteLine(Classify(-100)); Console.WriteLine(Classify(5.7)); static string Classify(double measurement) => measurement switch { < -40.0 => "Too low", >= -40.0 and < 0 => "Low", >= 0 and < 10.0 => "Acceptable", >= 10.0 and < 20.0 => "High", >= 20.0 => "Too high", double.NaN => "Unknown", };çæãããåºåã¯æ¬¡ã®ãšããã§ãã
High Too low Acceptableend ã®äŸ
äŸ:
Console.WriteLine(GetCalendarSeason(new DateTime(2021, 1, 19))); Console.WriteLine(GetCalendarSeason(new DateTime(2021, 10, 9))); Console.WriteLine(GetCalendarSeason(new DateTime(2021, 5, 11))); static string GetCalendarSeason(DateTime date) => date.Month switch { 3 or 4 or 5 => "spring", 6 or 7 or 8 => "summer", 9 or 10 or 11 => "autumn", 12 or 1 or 2 => "winter", _ => throw new ArgumentOutOfRangeException(nameof(date), $"Date with unexpected month: {date.Month}."), };çæãããåºåã¯æ¬¡ã®ãšããã§ãã
winter autumn springend ã®äŸ
äŸ:
object msg = "msg"; object obj = 5; bool flag = true; // This is parsed as: (msg is (not int) or string) bool result = msg is not int or string; Console.WriteLine($"msg (\"msg\"): msg is not int or string: {result}"); // This is parsed as: (obj is (int or string)) && flag result = obj is int or string && flag; Console.WriteLine($"obj (5), flag (true): obj is int or string && flag: {result}"); // This is parsed as: (obj is int) || ((obj is string) && flag) result = obj is int || obj is string && flag; Console.WriteLine($"obj (5), flag (true): obj is int || obj is string && flag: {result}"); flag = false; // This is parsed as: (obj is (int or string)) && flag result = obj is int or string && flag; Console.WriteLine($"obj (5), flag (false): obj is int or string && flag: {result}"); // This is parsed as: (obj is int) || ((obj is string) && flag) result = obj is int || obj is string && flag; Console.WriteLine($"obj (5), flag (false): obj is int || obj is string && flag: {result}");çæãããåºåã¯æ¬¡ã®ãšããã§ãã
msg ("msg"): msg is not int or string: True obj (5), flag (true): obj is int or string && flag: True obj (5), flag (true): obj is int || obj is string && flag: True obj (5), flag (false): obj is int or string && flag: False obj (5), flag (false): obj is int || obj is string && flag: Trueend ã®äŸ
11.2.11 ãªã¹ã ãã¿ãŒã³
list_patternã¯ããªã¹ããŸãã¯é åå ã®èŠçŽ ã®ã·ãŒã±ã³ã¹ãšäžèŽããŸãã
list_pattern
: list_pattern_clause simple_designation?
;
list_pattern_clause
: '[' (pattern (',' pattern)* ','?)? ']'
;
list_patternã¯ãã«ãŠã³ãå¯èœãªä»»æã®å (§18.1) ããã³ã€ã³ããã¯ã¹å¯èœãª (§18.1) ãšäºææ§ããããŸããããã«ã¯ãåŒæ°ãšããŠIndexãåãåãã¢ã¯ã»ã¹å¯èœãªã€ã³ãã¯ãµãŒããŸã㯠1 ã€ã®int ãã©ã¡ãŒã¿ãŒãæã€ã¢ã¯ã»ã¹å¯èœãªã€ã³ãã¯ãµãŒããããŸãã äž¡æ¹ã®ã€ã³ãã¯ãµãŒãååšããå Žåã¯ãåè
ãæšå¥šãããŸãã (æé»çãªã€ã³ããã¯ã¹ã®ãµããŒãã®è©³çްã«ã€ããŠã¯ã §18.4.2 ãåç
§ããŠãã ãã)ã
expr is [1, 2, 3]圢åŒã®ãã¿ãŒã³ã¯ã次ã®ã³ãŒããšåãã§ãã
expr.Length is 3
&& expr[new Index(0, fromEnd: false)] is 1
&& expr[new Index(1, fromEnd: false)] is 2
&& expr[new Index(2, fromEnd: false)] is 3
äŸ:
int[] numbers = { 1, 2, 3 }; Console.WriteLine(numbers is [1, 2, 3]); // True Console.WriteLine(numbers is [1, 2, 4]); // False Console.WriteLine(numbers is [1, 2, 3, 4]); // False Console.WriteLine(numbers is [0 or 1, <= 2, >= 3 and not 7]); // Trueend ã®äŸ
ç Žæ£ãã¿ãŒã³ (§11.2.7) ã¯ãä»»æã® 1 ã€ã®èŠçŽ ã«äžèŽããŸãã
äŸ:
List<int> numbers = new() { 1, 2, 3 }; if (numbers is [_, var second, _]) { Console.WriteLine($"The second element is {second}."); }end ã®äŸ
11.2.12 ã¹ã©ã€ã¹ ãã¿ãŒã³
slice_pattern㯠0 å以äžã®èŠçŽ ãç Žæ£ããŸãã ããã¯ã list_pattern_clauseå ã§ã®ã¿çŽæ¥äœ¿çšããããã®å¥ã§ã¯æå€§ã§ 1 åã®ã¿äœ¿çšãããŸãã
slice_pattern
: '..' pattern?
;
ãµããã¿ãŒã³ã®ãªã slice_pattern ã¯ã list_patternãšäºææ§ã®ããä»»æã®åãšäºææ§ããããŸãã ãµããã¿ãŒã³ãæã€slice_patternã¯ãã«ãŠã³ãå¯èœãªä»»æã®å (§18.1) ããã³ã¹ã©ã€ã¹å¯èœãª (§18.1) ãšäºææ§ããããŸããããã«ã¯ãåŒæ°ãšããŠRangeãåãåãã¢ã¯ã»ã¹å¯èœãªã€ã³ãã¯ãµãŒããŸã㯠2 ã€ã®Slice ãã©ã¡ãŒã¿ãŒãæã€ã¢ã¯ã»ã¹å¯èœãªint ã¡ãœããããããŸãã äž¡æ¹ãååšããå Žåã¯ãåè
ã奜ãŸããã (æé»çãªã€ã³ããã¯ã¹ã®ãµããŒãã®è©³çްã«ã€ããŠã¯ã §18.4.2 ãåç
§ããŠãã ãã)ã
slice_patternã¯é©åãªç Žæ£ã®ããã«åäœããŸããã€ãŸãããã®ãããªãã¿ãŒã³ã«å¯Ÿãããã¹ãã¯è¡ãããŸããã 代ããã«ãä»ã®ããŒã (ã€ãŸããé·ããšã€ã³ãã¯ãµãŒ) ã«ã®ã¿åœ±é¿ããŸãã ããšãã°ããã©ãŒã expr is [1, .. var s, 3] ã®ãã¿ãŒã³ã¯ã次ã®ã³ãŒããšåãã§ã (æç€ºç㪠Index ãš Range ãµããŒãã«ãã£ãŠäºææ§ãããå Žå)ã
expr.Length is >= 2
&& expr[new Index(0, fromEnd: false)] is 1
&& expr[new Range(new Index(1, fromEnd: false), new Index(1, fromEnd: true))] is var s
&& expr[new Index(1, fromEnd: true)] is 3
slice_patternã®å
¥ååã¯ãåºã«ãªãthis[Range]ãŸã㯠Slice ã¡ãœããã®æ»ãå€ã®åã§ããã2 ã€ã®äŸå€ããããŸããstringãšé
åã®å Žåã¯ãããããstring.SubstringãšRuntimeHelpers.GetSubArrayã䜿çšããŸãã
äŸ: ã¹ã©ã€ã¹ ãã¿ãŒã³ã¯ãå ¥åã·ãŒã±ã³ã¹ã®å é ãŸãã¯æ«å°Ÿã§ã®ã¿èŠçŽ ãç §åããããã«äœ¿çšã§ããŸãã
Console.WriteLine(new[] { 1, 2, 3, 4, 5 } is [> 0, > 0, ..]); // True Console.WriteLine(new[] { 1, 1 } is [_, _, ..]); // True Console.WriteLine(new[] { 0, 1, 2, 3, 4 } is [> 0, > 0, ..]); // False Console.WriteLine(new[] { 1 } is [1, 2, ..]); // False Console.WriteLine(new[] { 1, 2, 3, 4 } is [.., > 0, > 0]); // True Console.WriteLine(new[] { 2, 4 } is [.., > 0, 2, 4]); // False Console.WriteLine(new[] { 2, 4 } is [.., 2, 4]); // True Console.WriteLine(new[] { 1, 2, 3, 4 } is [>= 0, .., 2 or 4]); // True Console.WriteLine(new[] { 1, 0, 0, 1 } is [1, 0, .., 0, 1]); // True Console.WriteLine(new[] { 1, 0, 1 } is [1, 0, .., 0, 1]); // Falseend ã®äŸ
äŸ: ãµããã¿ãŒã³ã¯ãã¹ã©ã€ã¹ ãã¿ãŒã³å ã§å ¥ãåã«ããããšãã§ããŸãã
MatchMessage("aBBA"); // output: Message aBBA matches; inner part is BB. MatchMessage("apron"); // output: Message apron doesn't match. void MatchMessage(string message) { var result = message is ['a' or 'A', .. var s, 'a' or 'A'] ? $"Message {message} matches; inner part is {s}." : $"Message {message} doesn't match."; Console.WriteLine(result); } Validate(new[] { -1, 0, 1 }); // output: not valid Validate(new[] { -1, 0, 0, 1 }); // output: valid void Validate(int[] numbers) { var result = numbers is [< 0, .. { Length: 2 or 4 }, > 0] ? "valid" : "not valid"; Console.WriteLine(result); }end ã®äŸ
ECMA C# draft specification