Note
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãµã€ã³ã€ã³ãŸãã¯ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
8.1 å šè¬
C# èšèªã®åã¯ã åç §å ãšå€åã® 2 ã€ã®äž»èŠãªã«ããŽãªã«å ãããŠããŸãã å€åãŸãã¯åç §åã¯ã1 ã€ä»¥äžã®åãã©ã¡ãŒã¿ãŒãåãåããžã§ããªãã¯åã§ããå ŽåããããŸãã åãã©ã¡ãŒã¿ã§ã¯ãå€åãšåç §åã®äž¡æ¹ãæå®ã§ããŸãã
type
: reference_type
| value_type
| type_parameter
| pointer_type // unsafe code support
;
pointer_type (§24.3.1) ã¯ãå®å šã§ãªãã³ãŒã (§24) ã§ã®ã¿äœ¿çšã§ããŸãã
å€åã¯åç §åãšã¯ç°ãªããå€åã®å€æ°ã«ã¯ããŒã¿ãçŽæ¥å«ãŸããŸãããåç §åã®å€æ°ã«ã¯ããŒã¿ãžã® åç § ãæ ŒçŽãããåŸè 㯠ãªããžã§ã¯ããšåŒã°ããŸãã åç §åã䜿çšãããš 2 ã€ã®å€æ°ãåããªããžã§ã¯ããåç §ã§ããããã1 ã€ã®å€æ°ã«å¯ŸããæŒç®ã«ãã£ãŠãããäžæ¹ã®å€æ°ã«ãã£ãŠåç §ããããªããžã§ã¯ãã«åœ±é¿ãäžããããšãã§ããŸãã å€åã䜿çšãããšãåã ã®å€æ°ãããŒã¿ã®ã³ããŒãåã ã§æã¡ã1 ã€ã«å¯Ÿããæäœãããäžæ¹ã«åœ±é¿ãäžããããšã¯ã§ããŸããã
泚: 倿°ãåç §ãŸãã¯åºåãã©ã¡ãŒã¿ã§ããå Žåã倿°èªäœã«ã¯ã¹ãã¬ãŒãžããªããå¥ã®å€æ°ã®ã¹ãã¬ãŒãžãåç §ããŸãã ãã®å Žåãref ãŸã㯠out 倿°ã¯å®è³ªçã«å¥ã®å€æ°ã®ãšã€ãªã¢ã¹ã§ãããå¥åã®å€æ°ã§ã¯ãããŸããã æ³šé
C# ã®åã·ã¹ãã ã¯çµ±äžãããŠãããããããåã®å€ããªããžã§ã¯ããšããŠæ±ãããšãã§ããŸãã C# ã«ãããåã¯ãã¹ãŠãçŽæ¥çãŸãã¯éæ¥çã« object ã¯ã©ã¹åããæŽŸçããobject ã¯ãã¹ãŠã®åã®ç©¶æ¥µã®åºåºã¯ã©ã¹ã§ãã åç
§åã®å€ã¯ãå€ãåçŽã« object åãšããŠã¿ãªãããšã«ãã£ãŠãªããžã§ã¯ããšããŠæ±ãããŸãã å€åã®å€ã¯ãããã¯ã¹åãšããã¯ã¹åè§£é€æäœãå®è¡ããããšã«ãã£ãŠããªããžã§ã¯ããšããŠæ±ãããŸã (§8.3.13)ã
䟿å®äžããã®ä»æ§å šäœã§ã¯ãäžéšã®ã©ã€ãã©ãª ã¿ã€ãåã¯å®å šãªåå修食ã䜿çšããã«èšè¿°ãããŠããŸãã 詳现ã«ã€ããŠã¯Â§C.5 ãåç §ããŠãã ããã
8.2 åç §å
8.2.1 å šè¬
åç
§åã¯ãã¯ã©ã¹åãã€ã³ã¿ãŒãã§ã€ã¹åãé
ååãããªã²ãŒãåã dynamic åããŸãã¯åç
§åãšããŠå¶çŽãããŠããä»»æã®åãã©ã¡ãŒã¿ãŒ (ã€ãŸããåç
§åå¶çŽãæã€ä»»æã®åãã©ã¡ãŒã¿ãŒãŸãã¯ã¯ã©ã¹åå¶çŽ (§15.2.5)) ã§ãã ããããã® null é蚱容åç
§åã«ã¯ãååã« ? ã远å ããããšã§ç€ºããã察å¿ãã null 蚱容åç
§åããããŸãã
reference_type
: non_nullable_reference_type
| nullable_reference_type
;
non_nullable_reference_type
: class_type
| interface_type
| array_type
| delegate_type
| 'dynamic'
;
class_type
: type_name
| 'object'
| 'string'
;
interface_type
: type_name
;
array_type
: array_type nullable_type_annotation rank_specifier+
| non_array_type rank_specifier+
;
non_array_type
: non_array_non_nullable_type nullable_type_annotation?
| pointer_type // unsafe code support
;
non_array_non_nullable_type
: non_nullable_value_type
| class_type
| interface_type
| delegate_type
| 'dynamic'
| type_parameter
;
rank_specifier
: '[' ','* ']'
;
delegate_type
: type_name
;
nullable_reference_type
: non_nullable_reference_type nullable_type_annotation
;
nullable_type_annotation
: '?'
;
pointer_type (§24.3.1) ã¯å®å šã§ãªãã³ãŒã (§24.3) ã§ã®ã¿äœ¿çšã§ããŸãã nullable_reference_typeã¯ã§8.9 ã§åŸè¿°ããŸãã
åç
§åã®å€ã¯ãåã®ã€ã³ã¹ã¿ã³ã¹ãžã®åç
§ã§ãããåŸè
ã¯ãªããžã§ã¯ããšåŒã°ããŸãã ç¹å¥ãªå€ null ã¯ãã¹ãŠã®åç
§åãšäºææ§ããããã€ã³ã¹ã¿ã³ã¹ãååšããªãããšã瀺ããŸãã
8.2.2 ã¯ã©ã¹å
ã¯ã©ã¹åã¯ã ããŒã¿ ã¡ã³ããŒs (宿°ãšãã£ãŒã«ã)ã 颿°ã¡ã³ããŒs (ã¡ãœãããããããã£ãã€ãã³ããã€ã³ãã¯ãµãŒãæŒç®åãã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒããã¡ã€ãã©ã€ã¶ãŒãéçã³ã³ã¹ãã©ã¯ã¿ãŒ)ãããã³å ¥ãåã«ãªã£ãåãå«ãããŒã¿æ§é ãå®çŸ©ããŸãã ã¯ã©ã¹åã¯ç¶æ¿ããµããŒãããŸããç¶æ¿ãšã¯ã掟çã¯ã©ã¹ãåºæ¬ã¯ã©ã¹ãæ¡åŒµããã³ç¹æ®åã§ããã¡ã«ããºã ã§ãã ã¯ã©ã¹åã®ã€ã³ã¹ã¿ã³ã¹ã¯ãobject_creation_expressions (§12.8.17.2) ã䜿çšããŠäœæãããŸãã
ã¯ã©ã¹åã«ã€ããŠã¯ §15 ã§èª¬æããŸãã
ç¹å®ã®å®çŸ©æžã¿ã¯ã©ã¹åã¯ã次ã®è¡šã«ç€ºãããã«ãC# èšèªã§ã¯ç¹å¥ãªæå³ãæã¡ãŸãã
| ã¯ã©ã¹å | 説æ |
|---|---|
System.Object |
ãã®ä»ãã¹ãŠã®åã®æçµçãªåºåºã¯ã©ã¹ã ã§8.2.3ããåç §ããŠãã ããã |
System.String |
C# èšèªã®æåååã ã§8.2.5ããåç §ããŠãã ããã |
System.ValueType |
ãã¹ãŠã®å€åã®åºåºã¯ã©ã¹ã ã§8.3.2ããåç §ããŠãã ããã |
System.Enum |
ãã¹ãŠã® enum åã®åºåºã¯ã©ã¹ã
§20.5 ãåç
§ããŠãã ããã |
System.Array |
ãã¹ãŠã®é ååã®åºåºã¯ã©ã¹ã ã§17.2.2ããåç §ããŠãã ããã |
System.Delegate |
ãã¹ãŠã® delegate åã®åºåºã¯ã©ã¹ã
§21.1 ãåç
§ããŠãã ããã |
System.Exception |
ãã¹ãŠã®äŸå€åã®åºåºã¯ã©ã¹ã §22.3 ãåç §ããŠãã ããã |
8.2.3 ãªããžã§ã¯ãå
object ã¯ã©ã¹åã¯ããã®ä»ãã¹ãŠã®åã®æçµçãªåºåºã¯ã©ã¹ã§ãã C# ã®ãã¹ãŠã®åã¯ãçŽæ¥çãŸãã¯éæ¥çã« object ã¯ã©ã¹åããæŽŸçããŸãã
ããŒã¯ãŒã object ã¯ãå®çŸ©æžã¿ã¯ã©ã¹ System.Object ã®åãªããšã€ãªã¢ã¹ã§ãã
8.2.4 åçå
dynamic ãªã©ã® object åã¯ããªããžã§ã¯ããåç
§ã§ããŸãã å dynamic ã®åŒã«æŒç®ãé©çšããããšããã®è§£æ±ºã¯ããã°ã©ã ãå®è¡ããããŸã§å»¶æãããŸãã ãããã£ãŠãåç
§å
ã®ãªããžã§ã¯ãã«æäœãæ£åœã«é©çšã§ããªãå Žåãã³ã³ãã€ã«äžã«ãšã©ãŒã¯çºçããŸããã 代ããã«ãå®è¡æã«æäœã®è§£æ±ºã倱æãããšäŸå€ãã¹ããŒãããŸãã
dynamic åã«ã€ããŠã¯ §8.7 ã§ãåçãã€ã³ãã£ã³ã°ã«ã€ããŠã¯ §12.3.1 ã§è©³è¿°ããŠããŸãã
8.2.5 æååå
string åã¯ãobject ããçŽæ¥ç¶æ¿ããã sealed ã¯ã©ã¹åã§ãã
string ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã¯ãUTF-16 ã³ãŒãåäœã®ã·ãŒã±ã³ã¹ã衚ããŸãã
string åã®å€ã¯ãæååãªãã©ã«ãšããŠèšè¿°ã§ããŸã (§6.4.5.6)ã
ããŒã¯ãŒã string ã¯ãå®çŸ©æžã¿ã¯ã©ã¹ System.String ã®åãªããšã€ãªã¢ã¹ã§ãã
8.2.6 ã€ã³ã¿ãŒãã§ã€ã¹å
ã€ã³ã¿ãŒãã§ã€ã¹ã«ããã³ã³ãã©ã¯ããå®çŸ©ãããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããã¯ã©ã¹ãŸãã¯æ§é äœã¯ããã®å¥çŽã«åŸãå¿ èŠããããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã¯è€æ°ã®åºæ¬ã€ã³ã¿ãŒãã§ã€ã¹ããç¶æ¿ããããšãã§ããã¯ã©ã¹ãŸãã¯æ§é äœã¯è€æ°ã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããããšãã§ããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ã®çš®é¡ã«ã€ããŠã¯ã §19 ãåç §ããŠãã ããã
8.2.7 é åå
é åã¯ãèšç®ãããã€ã³ããã¯ã¹çµç±ã§ã¢ã¯ã»ã¹ããã 0 å以äžã®å€æ°ãå«ãããŒã¿æ§é ã§ãã é åã«å«ãŸãã倿°ã¯é åã®èŠçŽ ãšãåŒã°ãããã¹ãŠåãåã§ããããã®åã¯é åã®èŠçŽ åãšåŒã°ããŸãã
é ååã«ã€ããŠã¯ã§17 ã§èª¬æããŸãã
8.2.8 ããªã²ãŒãå
ããªã²ãŒãã¯ã1 ã€ä»¥äžã®ã¡ãœãããåç §ããããŒã¿æ§é ã§ãã ã€ã³ã¹ã¿ã³ã¹ ã¡ãœããã®å Žåã察å¿ãããªããžã§ã¯ã ã€ã³ã¹ã¿ã³ã¹ãåç §ããŸãã
泚: C ãŸã㯠C++ ã®ããªã²ãŒãã«æãè¿ããã®ã¯é¢æ°ãã€ã³ã¿ãŒã§ããã颿°ãã€ã³ã¿ãŒã¯éç颿°ã®ã¿ãåç §ã§ããã®ã«å¯Ÿããããªã²ãŒãã¯éçã¡ãœãããšã€ã³ã¹ã¿ã³ã¹ ã¡ãœããã®äž¡æ¹ãåç §ã§ããŸãã åŸè ã®å Žåãããªã²ãŒãã¯ã¡ãœããã®ãšã³ã㪠ãã€ã³ããžã®åç §ã ãã§ãªããã¡ãœãããåŒã³åºããªããžã§ã¯ã ã€ã³ã¹ã¿ã³ã¹ãžã®åç §ãæ ŒçŽããŸãã æ³šé
ããªã²ãŒãåã«ã€ããŠã¯ã §21 ãåç §ããŠãã ããã
8.3 å€å
8.3.1 å šè¬
å€åã¯ãæ§é äœåãŸãã¯åæåã®ããããã§ãã C# ã«ã¯ãåçŽå s ãšåŒã°ããå®çŸ©æžã¿ã®æ§é äœ åã®ã»ãããçšæãããŠããŸãã åçŽåã¯ãããŒã¯ãŒããšã³ã³ããã¹ã ããŒã¯ãŒãã䜿çšããŠèå¥ãããŸãã
value_type
: non_nullable_value_type
| nullable_value_type
;
non_nullable_value_type
: struct_type
| enum_type
;
struct_type
: type_name
| simple_type
| tuple_type
;
simple_type
: numeric_type
| 'bool'
;
numeric_type
: integral_type
| floating_point_type
| 'decimal'
;
integral_type
: 'sbyte'
| 'byte'
| 'short'
| 'ushort'
| 'int'
| 'uint'
| 'nint'
| 'nuint'
| 'long'
| 'ulong'
| 'char'
;
floating_point_type
: 'float'
| 'double'
;
tuple_type
: '(' tuple_type_element (',' tuple_type_element)+ ')'
;
tuple_type_element
: type identifier?
;
enum_type
: type_name
;
nullable_value_type
: non_nullable_value_type nullable_type_annotation
;
åånintãšnuintã¯ããŒã¯ãŒãã§ã¯ãªããããtype_nameãŸãã¯value_typeãšããŠèªèããéã«æ§æçãªãããŸããããããŸãã ãããã®ååã®ããããã§å解決 (§7.7.1) ãæåããå Žåããã®åå㯠type_nameãšããŠèªèãããŸãããã以å€ã®å Žå㯠ãvalue_typeãšããŠèªèããããã®ãšããŸãã
åç
§åã®å€æ°ãšã¯ç°ãªããå€åã®å€æ°ã¯ãå€åã null 蚱容å€åã§ããå Žåã«ã®ã¿å€ null ãå«ããããšãã§ããŸã (§8.3.12)ã ãã¹ãŠã® null é蚱容å€åã«ã¯ãåãå€ã»ãããšå€ null ã衚ã察å¿ãã null 蚱容å€åãååšããŸãã
å€åã®å€æ°ã«å²ãåœãŠããšãå²ãåœãŠãããå€ã®ã³ããŒãäœæãããŸãã ããã¯ãåç §åã®å€æ°ãžã®ä»£å ¥ãšã¯ç°ãªããŸããåç §åã®å€æ°ãžã®ä»£å ¥ã§ã¯ãåç §ã¯ã³ããŒãããŸãããåç §ã«ãã£ãŠèå¥ããããªããžã§ã¯ãã¯ã³ããŒãããŸããã
8.3.2 System.ValueType å
ãã¹ãŠã®å€åã¯ãã¯ã©ã¹ class ããç¶æ¿ããã System.ValueTypeobject ããæé»çã«ç¶æ¿ããã ãããªãåãå€åããæŽŸçããããšã¯ã§ããªããããå€åã¯æé»çã«ã·ãŒã«ããããŸã (§15.2.2.3)ã
System.ValueType èªäœã¯ãvalue_type ã§ã¯ãªãã®ã§ã泚æãã ããã ããããããã¯ãã¹ãŠã® value_type ãèªåçã«æŽŸçããã class_type ã§ãã
8.3.3 ããã©ã«ã ã³ã³ã¹ãã©ã¯ã¿
ãã¹ãŠã®å€åã«ã¯ãæ¢å®ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãšåŒã°ããããã©ã¡ãŒã¿ãŒãªãã®ãããªã㯠ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒããããŸãã ãã©ã¡ãŒã¿ãŒãªãã®ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒãæç€ºçã«å®£èšããªãæ§é äœåã®å Žåãæ¢å®ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ã³ã³ãã€ã©ã«ãã£ãŠåæãããŸãã ããã©ã«ã ã³ã³ã¹ãã©ã¯ã¿ã¯ãå€åã®ããã©ã«ãå€ãšåŒã°ãããŒãåæåã€ã³ã¹ã¿ã³ã¹ãè¿ããŸãã
- ãã¹ãŠã® simple_types ã®å Žåãããã©ã«ãå€ã¯ãã¹ãŠãŒãã®ããã ãã¿ãŒã³ã«ãã£ãŠçæãããå€ã§ãã
-
sbyteãbyteãshortãushortãintãuintãnintãnuintãlongãããã³ulongã®å Žåãæ¢å®å€ã¯0ã -
charã®å Žåãããã©ã«ãå€ã¯ã'\x0000'ã§ãã -
floatã®å Žåãããã©ã«ãå€ã¯ã0.0fã§ãã -
doubleã®å Žåãããã©ã«ãå€ã¯ã0.0dã§ãã -
decimalã®å Žåãããã©ã«ãå€ã¯ã0mã§ã (ã€ãŸããã¹ã±ãŒã« 0 ã®å€ 0)ã -
boolã®å Žåãããã©ã«ãå€ã¯ãfalseã§ãã -
enum_type
Eã®å Žåãããã©ã«ãå€ã¯ã0ã§ãåEã«å€æãããŸãã
-
-
struct_type ã®å Žåãããã©ã«ãå€ã¯ããã¹ãŠã®å€åãã£ãŒã«ããããã©ã«ãå€ã«èšå®ãããã¹ãŠã®åç
§åãã£ãŒã«ãã
nullã«èšå®ããããšã«ãã£ãŠçæãããå€ã§ãã -
nullable_value_type ã®å Žåãããã©ã«ãå€ã¯
HasValueããããã£ã false ã§ããã€ã³ã¹ã¿ã³ã¹ã§ãã ãã®ããã©ã«ãå€ã¯ãnull 蚱容å€åã® null å€ãšãåŒã°ããŸãã ãã®ãããªå€ã®Valueããããã£ãèªã¿åãããšãããšSystem.InvalidOperationExceptionãåã®äŸå€ãã¹ããŒãããŸã (§8.3.12)ã
ä»ã®ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãšåæ§ã«ãå€åã®ããã©ã«ã ã³ã³ã¹ãã©ã¯ã¿ã¯ new æŒç®åã䜿çšããŠåŒã³åºãããŸãã
泚: å¹çäžã®çç±ããããã®èŠä»¶ã¯å®è£ ã§å®éã«ã³ã³ã¹ãã©ã¯ã¿åŒã³åºããçæããããšãæå³ããŠããŸããã æç€ºçã«å®£èšããããã©ã¡ãŒã¿ãŒãªãã®ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒãæããªãå€åã®å Žåãæ¢å®å€ã®åŒ (§12.8.21) ã¯ãæ¢å®ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããå ŽåãšåãçµæãçæããŸãã æç€ºçãªãã©ã¡ãŒã¿ãŒãªãã®ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã宣èšããæ§é äœåã®å Žåã
defaultã¯ãŒãåæåã®æ¢å®å€ãçæããŸãããnew S()ã¯å®£èšãããã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºããŸãããçµæã¯ç°ãªãå ŽåããããŸãã æ³šé
äŸ: 以äžã®ã³ãŒãã§ã¯ã倿°
iãjãkã¯ããŒãã«åæåãããŸããclass A { void F() { int i = 0; int j = new int(); int k = default(int); } }çµäºãµã³ãã«
æ§é äœåã¯ããã©ã¡ãŒã¿ãŒãªãã®ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒãå«ãã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã宣èšã§ããŸãã æç€ºçã«å®£èšããããã©ã¡ãŒã¿ãŒãªãã®ã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ããããªã㯠ã¢ã¯ã»ã·ããªã㣠(§16.8.9) ãæã€å¿ èŠããããŸãã
8.3.4 æ§é äœå
æ§é äœåã¯ã宿°ããã£ãŒã«ããã¡ãœãããããããã£ãã€ãã³ããã€ã³ãã¯ãµãæŒç®åãã€ã³ã¹ã¿ã³ã¹ ã³ã³ã¹ãã©ã¯ã¿ãéçã³ã³ã¹ãã©ã¯ã¿ãããã³ãã¹ããããåã宣èšã§ããå€åã§ãã æ§é äœã®å®£èšã«ã€ããŠã¯ §16 ã§èª¬æãããŠããŸãã
8.3.5 åçŽå
åçŽåã¯ã次ã®è¡šã«ç€ºãããã«ãstructåå空éã®å®çŸ©æžã¿ã®Systemåã®ãšã€ãªã¢ã¹ã§ãã
| ããŒã¯ãŒã | ãšã€ãªã¢ã¹åãããå |
|---|---|
sbyte |
System.SByte |
byte |
System.Byte |
short |
System.Int16 |
ushort |
System.UInt16 |
int |
System.Int32 |
uint |
System.UInt32 |
nint |
System.IntPtr |
nuint |
System.UIntPtr |
long |
System.Int64 |
ulong |
System.UInt64 |
char |
System.Char |
float |
System.Single |
double |
System.Double |
bool |
System.Boolean |
decimal |
System.Decimal |
ãã¹ãŠã®åçŽåã«ã¯ã¡ã³ããŒããããŸãã ååçŽåã«ã¯ããšã€ãªã¢ã¹åãããæ§é äœåã®ã¡ã³ããŒããããŸãã
äŸ:
intã«ã¯ãSystem.Int32ã§å®£èšãããå®è£ åºæã®ã¡ã³ããŒãšãSystem.Objectããç¶æ¿ãããã¡ã³ã㌠(å¿ é ããã³å®è£ åºæ) ããããæ¬¡ã®ã¹ããŒãã¡ã³ããèš±å¯ãããŸããint i = int.MaxValue; // System.Int32.MaxValue constant string s = i.ToString(); // System.Int32.ToString() instance method string t = 123.ToString(); // System.Int32.ToString() instance methodçµäºãµã³ãã«
泚: åçŽåã¯ããã远å ã®æäœãèš±å¯ããŠããç¹ã§ãä»ã®æ§é äœåãšã¯ç°ãªããŸãã
- ã»ãšãã©ã®åçŽåã§ã¯ããªãã©ã«ãèšè¿°ããããšã«ãã£ãŠå€ãäœæã§ããŸã (§6.4.5)ããã ããC# ã§ã¯äžè¬ã«æ§é äœã®ãªãã©ã«ã«ã€ããŠã¯èŠå®ãããŠããŸããã äŸ:
123ã¯ãåintã®ãªãã©ã«ã§ã'a'ã¯ãcharã®ãªãã©ã«ã§ãã çµäºãµã³ãã«- åŒã®ãªãã©ã³ãããã¹ãŠåçŽå宿°ã§ããå Žåãã³ã³ãã€ã©ã¯ã³ã³ãã€ã«æã«åŒãè©äŸ¡ã§ããŸãã ãã®ãããªåŒã¯ ãconstant_expression (§12.26) ãšåŒã°ããŸãã ä»ã®æ§é äœåã§å®çŸ©ãããæŒç®åãå«ãåŒã¯å®æ°åŒãšã¯ã¿ãªãããŸããã
const宣èšãéããŠãåçŽåã®å®æ°ã宣èšããããšãã§ããŸã (§15.4)ã ä»ã®æ§é äœåã®å®æ°ãæã€ããšã¯ã§ããŸããããéçèªã¿åãå°çšãã£ãŒã«ãã«ãã£ãŠåæ§ã®å¹æãæäŸãããŸãã- åçŽåã«é¢ä¿ãã倿ã¯ãä»ã®æ§é äœåã«ãã£ãŠå®çŸ©ããã倿æŒç®åã®è©äŸ¡ã«åå ã§ããŸããããŠãŒã¶ãŒå®çŸ©ã®å€ææŒç®åã¯ãå¥ã®ãŠãŒã¶ãŒå®çŸ©ã®å€ææŒç®åã®è©äŸ¡ã«åå ããããšã¯ã§ããŸãã (§10.5.3)ã
泚éã
8.3.6 æŽæ°å
C# ã§ã¯ã次ã«ç€ºãããã«ããµã€ãºãšå€ã®ç¯å²ãæã€æ¬¡ã®æŽæ°åããµããŒããããŠããŸãã
-
sbyteåã¯ã-128ãã127ãŸã§ã®å€ãæã€ç¬Šå·ä»ã 8 ãããæŽæ°ã衚ããŸãã -
byteåã¯ã0ãã255ãŸã§ã®å€ãæã€ç¬Šå·ãªã 8 ãããæŽæ°ã衚ããŸãã -
shortåã¯ã-32768ãã32767ãŸã§ã®å€ãæã€ç¬Šå·ä»ã 16 ãããæŽæ°ã衚ããŸãã -
ushortåã¯ã0ãã65535ãŸã§ã®å€ãæã€ç¬Šå·ãªã 16 ãããæŽæ°ã衚ããŸãã -
intåã¯ã-2147483648ãã2147483647ãŸã§ã®å€ãæã€ç¬Šå·ä»ã 32 ãããæŽæ°ã衚ããŸãã -
uintåã¯ã0ãã4294967295ãŸã§ã®å€ãæã€ç¬Šå·ãªã 32 ãããæŽæ°ã衚ããŸãã -
nintåã¯ããµã€ãºãšå€ã®ç¯å²ãå®è£ ã§å®çŸ©ãããŠãããã€ãã£ã笊å·ä»ãæŽæ°ã衚ããŸãããintãŸãã¯longã®ããããã«ãªããŸãã -
nuintåã¯ããµã€ãºãšå€ã®ç¯å²ãå®è£ ã§å®çŸ©ãããŠãããããŸãã¯ã®ããããã§ããuintã衚ããŸãã ãã€ãã£ã笊å·ãªãæŽæ°ã®ãµã€ãºã¯ããã€ãã£ã笊å·ä»ãæŽæ°ã®ãµã€ãºãšåãã§ããå¿ èŠããããŸãã -
longåã¯ã-9223372036854775808ãã9223372036854775807ãŸã§ã®å€ãæã€ç¬Šå·ä»ã 64 ãããæŽæ°ã衚ããŸãã -
ulongåã¯ã0ãã18446744073709551615ãŸã§ã®å€ãæã€ç¬Šå·ãªã 64 ãããæŽæ°ã衚ããŸãã -
charåã¯ãUTF-16 ã³ãŒãåäœãšããŠã0ãã65535ãŸã§ã®å€ãæã€ç¬Šå·ãªã 16 ãããæŽæ°ã衚ããŸããæ³š:
charã¯ushortãšåã衚çŸã§ãããäžæ¹ã®åã§èš±å¯ãããŠãããã¹ãŠã®æäœãããäžæ¹ã®åã§ãèš±å¯ãããããã§ã¯ãããŸããã æ³šé
ãã¹ãŠã®ç¬Šå·ä»ãæŽæ°å㯠2 ã®è£æ°åœ¢åŒã䜿çšããŠè¡šãããŸãã
integral_typeåé æŒç®åãšäºé æŒç®åã¯ã§12.4.7 ã§è©³ãã説æãããŠããããã«ãåžžã«ç¬Šå·ä»ã 32 ããã粟床ã笊å·ãªã 32 ããã粟床ã笊å·ä»ã 64 ããã粟床ã笊å·ãªã 64 ããã粟床ããã€ãã£ã笊å·ãªã粟床ããŸãã¯ãã€ãã£ã笊å·ãªã粟床ã§åäœããŸãã
泚: ãã€ãã£ã粟床ã¯ã32 ããã ãã©ãããã©ãŒã ã§ã¯ 32 ãããã64 ããã ãã©ãããã©ãŒã ã§ã¯ 64 ããããæå³ããŸãã
nintããã³nuintã®æŒç®åã¯ããã倧ããªåã«ææ Œãããã®ã§ã¯ãªãããã€ãã£ã粟床ã䜿çšããŸãã æ³šé
char åã¯æŽæ°åãšããŠåé¡ãããŸãããä»ã®æŽæ°åãšã¯ 2 ã€ã®ç¹ã§ç°ãªããŸãã
- ä»ã®åãã
charåãžã®å®çŸ©æžã¿ã®æé»çãªå€æã¯ãããŸããã ç¹ã«ãbyteåãšushortåã¯charåã䜿çšããŠå®å šã«è¡šçŸå¯èœãªå€ã®ç¯å²ãæã£ãŠããŸãããsbyteãbyteããŸãã¯ushortããcharãžã®æé»çãªå€æã¯ååšããŸããã -
charåã®å®æ°ã¯ãcharacter_literal ãšããŠèšè¿°ããããchar åãžã®ãã£ã¹ããšçµã¿åãã㊠integer_literal ãšããŠèšè¿°ããå¿ èŠããããŸãã
äŸ:
(char)10ã¯ã'\x000A'ãšåãã§ãã çµäºãµã³ãã«
checked ããã³ unchecked æŒç®åã¯ãæŽæ°åã®ç®è¡æŒç®ããã³å€æã«å¯ŸãããªãŒããŒãã㌠ãã§ãã¯ãå¶åŸ¡ããããã«äœ¿çšããŸã (§12.8.20)ã
checked ã³ã³ããã¹ãã§ã¯ããªãŒããŒãããŒã«ããã³ã³ãã€ã«æãšã©ãŒãçæãããããSystem.OverflowException ãã¹ããŒãããŸãã
unchecked ã³ã³ããã¹ãã§ã¯ããªãŒããŒãããŒã¯ç¡èŠãããå®å
ã¿ã€ãã«é©åããªãäžäœãããã¯ç Žæ£ãããŸãã
8.3.7 æµ®åå°æ°ç¹å
C# ã¯ãfloat ãš double ã® 2 ã€ã®æµ®åå°æ°ç¹åããµããŒãããŸãã
float ããã³ double åã¯ã32 ãããå粟床ããã³ 64 ãããå粟床㮠IEC 60559 圢åŒã䜿çšããŠè¡šãããæ¬¡ã®å€ã®ã»ãããæäŸãããŸãã
- æ£ã®ãŒããšè² ã®ãŒãã ã»ãšãã©ã®ç¶æ³ã§ã¯ãæ£ã®ãŒããšè² ã®ãŒãã¯åçŽãªå€ 0 ãšåãããã«åäœããŸãããç¹å®ã®æäœã§ã¯ 2 ã€ã®æäœãåºå¥ãããŸã (§12.13.3)ã
- æ£ã®ç¡é倧ãšè² ã®ç¡é倧ã ç¡é倧ã¯ããŒã以å€ã®æ°åããŒãã§å²ããããªæŒç®ã§çæãããŸãã
äŸ:
1.0 / 0.0ã¯æ£ã®ç¡é倧ãâ1.0 / 0.0ã¯è² ã®ç¡é倧ã§ãã çµäºãµã³ãã« - Not-a-Number (æ°åã§ã¯ãªã) å€ã¯ãNaN ãšç¥ãããããšããããŸãã NaN ã¯ããŒãããŒãã§å²ããªã©ãç¡å¹ãªæµ®åå°æ°ç¹æŒç®ã§çæãããŸãã
-
s à m à 2ᵠ㮠圢åŒã®éãŒãå€ã®æééåã§ã¯ãs ã 1 ãŸã㯠â1 ã§ãm ããã³ e ã¯ç¹å®ã®æµ®åå°æ°ç¹åã«ãã£ãŠæ±ºãŸããŸãã
floatã®å Žåã0 <m< 2²⎠and â149 †e †104 ã§ãããdoubleã®å Žåã0 <m< 2âµÂ³ and â1075 †e †970 ã§ãã 鿣èŠåæµ®åå°æ°ç¹æ°ã¯æå¹ãªéãŒãå€ãšã¿ãªãããŸãã C# ã§ã¯ãæºæ å®è£ ã鿣èŠåæµ®åå°æ°ç¹æ°ããµããŒãããããšãèŠæ±ãçŠæ¢ãããŠããŸããã
floatåã¯ã7 æ¡ã®ç²ŸåºŠã§çŽ 1.5 à 10â»âŽâµ ãã 3.4 à 10³➠ãŸã§ã®ç¯å²ã®å€ã衚ãããšãã§ããŸãã
doubleåã¯ã15 ãã 17 æ¡ã®ç²ŸåºŠã§çŽ 5.0 à 10â»Â³Â²âŽ ãã 1.7 à 10³â°âž ãŸã§ã®ç¯å²ã®å€ã衚ãããšãã§ããŸãã
äºé
æŒç®åã®ããããã®ãªãã©ã³ããæµ®åå°æ°ç¹åã®å Žåã§12.4.7 ã«è©³è¿°ãããŠããããã«æšæºã®æ°å€ææ Œãé©çšãããfloat ãŸã㯠doubleç²ŸåºŠã§æŒç®ãå®è¡ãããŸãã
ä»£å ¥æŒç®åãå«ãæµ®åå°æ°ç¹æŒç®åã¯ãäŸå€ãçæããããšã¯ãããŸããã 代ããã«ãäŸå€çãªç¶æ³ã§ã¯ãæµ®åå°æ°ç¹æŒç®ã«ãã£ãŠã以äžã«ç€ºãããã«ãŒããç¡é倧ããŸã㯠NaN ãçæãããŸãã
- æµ®åå°æ°ç¹æŒç®ã®çµæã¯ã倿å ã®åœ¢åŒã§è¡šçŸå¯èœãªæãè¿ãå€ã§åæšäºå ¥ãããŸãã
- æµ®åå°æ°ç¹æŒç®ã®çµæã®å€§ããã倿å ã®åœ¢åŒã«å¯ŸããŠå°ããããå ŽåãæŒç®ã®çµæã¯æ£ã®ãŒããŸãã¯è² ã®ãŒãã«ãªããŸãã
- æµ®åå°æ°ç¹æŒç®ã®çµæã®å€§ããã倿å ã®åœ¢åŒã«å¯ŸããŠå€§ããããå ŽåãæŒç®ã®çµæã¯æ£ã®ç¡é倧ãŸãã¯è² ã®ç¡é倧ã«ãªããŸãã
- æµ®åå°æ°ç¹æŒç®ãç¡å¹ãªå ŽåãæŒç®ã®çµæã¯ NaN ã«ãªããŸãã
- æµ®åå°æ°ç¹æŒç®ã®ãªãã©ã³ãã®äžæ¹ãŸãã¯äž¡æ¹ã NaN ã®å ŽåãæŒç®ã®çµæã¯ NaN ã«ãªããŸãã
æµ®åå°æ°ç¹æŒç®ã¯ãæŒç®ã®çµæã®åãããé«ã粟床ã§å®è¡ãããå ŽåããããŸãã æµ®åå°æ°ç¹åã®å€ããã®åã®æ£ç¢ºãªç²ŸåºŠã«åŒ·å¶ããã«ã¯ãæç€ºçãªãã£ã¹ã (§12.9.8) ã䜿çšã§ããŸãã
äŸ: äžéšã®ããŒããŠã§ã¢ ã¢ãŒããã¯ãã£ã§ã¯ã
doubleåãããç¯å²ãšç²ŸåºŠãåºããextendedããŸãã¯ãlong doubleãæµ®åå°æ°ç¹åããµããŒãããŠããããã¹ãŠã®æµ®åå°æ°ç¹æŒç®ããã®ããé«ã粟床ã®åã䜿çšããŠæé»çã«å®è¡ããŸãã ãã®ãããªããŒããŠã§ã¢ ã¢ãŒããã¯ãã£ã§ã¯ãããã©ãŒãã³ã¹ãå€§å¹ ã«ç ç²ã«ããããšã§ã®ã¿ã粟床ã®äœãæµ®åå°æ°ç¹æŒç®ãå®è¡ã§ããŸããC# ã§ã¯ãããã©ãŒãã³ã¹ãšç²ŸåºŠã®äž¡æ¹ãç ç²ã«ããå®è£ ãèŠæ±ããã®ã§ã¯ãªãããã¹ãŠã®æµ®åå°æ°ç¹æŒç®ã«é«ç²ŸåºŠã®åã䜿çšã§ããŸãã ããæ£ç¢ºãªçµæããããã以å€ã«ã¯ã枬å®å¯èœãªå¹æã¯ã»ãšãã©ãããŸããã ãã ããä¹ç®ã«ãã£ãŠx * y / z> ã®ç¯å²å€ã®çµæãçæããããã®åŸã®é€ç®ã«ãã£ãŠäžæçãªçµæãdoubleã®ç¯å²ã«æ»ãããdouble圢åŒã®åŒã§ã¯ãåŒãããåºãç¯å²ã®åœ¢åŒã§è©äŸ¡ããããããç¡é倧ã§ã¯ãªãæéã®çµæãçæãããããšããããŸãã çµäºãµã³ãã«
8.3.8 Decimal å
decimal å㯠128 ãããã®ããŒã¿åã§ã財åãé貚ã®èšç®ã«é©ããŠããŸãã
decimal åã¯ãå°ãªããšã -7.9 à 10â»Â²âž ãã 7.9 à 10²➠ãŸã§ã®ç¯å²ã®å€ããå°ãªããšã 28 æ¡ã®ç²ŸåºŠã§è¡šçŸã§ããŸãã
å decimal ã®å€ã®æééå㯠(â1)áµ Ã c à 10â»áµ ã®åœ¢åŒã§ãç¬Šå· v ã¯ã0 ãŸã㯠1ãä¿æ° c 㯠0 †c<Cmax ã§æå®ãããã¹ã±ãŒã« e ã¯ãEmin †e †Emax ãšãªããããã§ã¯ãCmax ã¯å°ãªããšã 1 à 10²âžãEmin †0 ããã³ Emax ⥠28 ãšãªããŸãã
decimal åã¯å¿
ããã笊å·ä»ããŒããç¡é倧ããŸã㯠NaN ããµããŒãããããã§ã¯ãããŸããã
decimal 㯠10 ã®çޝä¹ã§ã¹ã±ãŒã«ãããæŽæ°ãšããŠè¡šãããŸãã 絶察å€ã decimal æªæºã® 1.0m ã®å Žåãå€ã¯å°ãªããšãå°æ°ç¹ç¬¬ 28 äœãŸã§æ£ç¢ºã§ãã 絶察å€ã decimal 以äžã§ãã 1.0m ã®å Žåãå€ã¯å°ãªããšãå°æ°ç¹ç¬¬ 28 äœãŸã§æ£ç¢ºã§ãã
float ããã³ double ããŒã¿åãšã¯ç°ãªãã0.1 ãªã©ã®å°æ°ã¯ãå°æ°è¡šçŸã§æ£ç¢ºã«è¡šçŸã§ããŸãã
float ããã³ double 衚çŸã§ã¯ããã®ãããªæ°å€ã¯å€ãã®å Žåãçµäºããªããã€ããªå±éãæã¡ããããã®è¡šçŸã§ã¯åãæšãŠãšã©ãŒãçºçãããããªããŸãã
äºé
æŒç®åã®ããããã®ãªãã©ã³ãã decimal åã®å Žåã§12.4.7 ã«è©³è¿°ãããŠããããã«æšæºã®æ°å€ææ Œãé©çšãããæŒç®ã¯ãdecimal 粟床ã§å®è¡ãããŸãã
decimal åã®å€ã«å¯ŸããæŒç®ã®çµæã¯ãæ£ç¢ºãªçµæãèšç®ã (åæŒç®åã®å®çŸ©ã«åŸã£ãŠã¹ã±ãŒã«ãä¿æ)ã衚çŸã§åæšäºå
¥ããŸãã çµæã¯æãè¿ã衚çŸå¯èœãªå€ã§åæšäºå
¥ãããçµæã 2 ã€ã®è¡šçŸå¯èœãªå€ã«çããè¿ãå Žåã¯ãæäžäœæ¡ã®äœçœ®ã«å¶æ°ãæã€å€ã§åæšäºå
¥ãããŸã (ããã¯ãéè¡åäžžãããšåŒã°ããŸã)ã ã€ãŸããçµæã¯å°ãªããšãå°æ°ç¹ç¬¬ 28 äœãŸã§æ£ç¢ºã§ãã äžžãã«ãã£ãŠããŒã以å€ã®å€ãããŒãå€ãçæãããå Žåãããããšã«æ³šæããŠãã ããã
decimal ç®è¡æŒç®ã«ãã£ãŠçæãããçµæã®å€§ããã decimal 圢åŒã«ã¯å€§ããããå ŽåãSystem.OverflowException ãã¹ããŒãããŸãã
decimal åã¯æµ®åå°æ°ç¹åããã粟床ã¯é«ããªããŸãããç¯å²ã¯çããªãå¯èœæ§ããããŸãã ãããã£ãŠãæµ®åå°æ°ç¹åãã decimal ãžã®å€æã§ã¯ãªãŒããŒãããŒäŸå€ãçºçããå¯èœæ§ããããdecimal ããæµ®åå°æ°ç¹åãžã®å€æã§ã¯ç²ŸåºŠã®äœäžããªãŒããŒãããŒäŸå€ãçºçããå¯èœæ§ããããŸãã ãããã®çç±ã«ãããæµ®åå°æ°ç¹åãš decimal ã®éã«ã¯æé»çãªå€æã¯ååšãããæç€ºçãªãã£ã¹ãããªãå Žåãæµ®åå°æ°ç¹ãªãã©ã³ããš decimal ãªãã©ã³ããåãåŒå
ã«çŽæ¥æ··åšãããšã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
8.3.9 ããŒã«å
bool åã¯ããŒã«è«çéã衚ããŸãã å bool ã«æå®ã§ããå€ã¯ãtrue ããã³ false ã§ãã
falseã®è¡šçŸã¯ §8.3.3ã§èª¬æãããŠããŸãã
true ã®è¡šçŸæ¹æ³ã¯ç¹ã«æå®ããŸããããfalse ã®è¡šçŸæ¹æ³ãšã¯ç°ãªããŸãã
bool ãšä»ã®å€åã®éã«ã¯æšæºçãªå€æã¯ååšããŸããã ç¹ã«ãbool åã¯æŽæ°åãšã¯åºå¥ããåé¢ãããŠãããããæŽæ°å€ã®ä»£ããã« bool å€ã䜿çšããããšã¯ã§ããããã®éãåæ§ã§ãã
泚: C èšèªããã³ C++ èšèªã§ã¯ããŒãã®æŽæ°å€ãŸãã¯æµ®åå°æ°ç¹å€ããŸã㯠NULL ãã€ã³ã¿ãããŒã«å€
falseã«å€æã§ãããŒã以å€ã®æŽæ°å€ãŸãã¯æµ®åå°æ°ç¹å€ããŸã㯠NULL 以å€ã®ãã€ã³ã¿ãããŒã«å€trueã«å€æã§ããŸãã C# ã§ã¯ããã®ãããªå€æã¯ãæŽæ°å€ãŸãã¯æµ®åå°æ°ç¹å€ã 0 ãšæç€ºçã«æ¯èŒãããããªããžã§ã¯ãåç §ãnullãšæç€ºçã«æ¯èŒããããšã«ãã£ãŠå®è¡ãããŸãã æ³šé
8.3.10 åæå
åæåã¯ãååä»ã宿°ãæã€åºæã®åã§ãã ãã¹ãŠã®åæåã«ã¯åºç€ãšãªãåããããããã¯ãbyteãsbyteãshortãushortãintãuintãlong ãŸã㯠ulong ã§ãã åæåã®å€ã®ã»ããã¯ããã®åºã«ãªãåã®å€ã®ã»ãããšåãã§ãã åæåã®å€ã¯ãååä»ã宿°ã®å€ã«å¶éãããŸããã åæåã¯ãåæå®£èš (§20.2) ã«ãã£ãŠå®çŸ©ãããŸãã
8.3.11 ã¿ãã«å
8.3.11.1 å šè¬
ã¿ãã«åã¯ããªãã·ã§ã³ã®ååãšåå¥ã®åãæã€ãé åºä»ããããåºå®é·ã®å€ã®ã·ãŒã±ã³ã¹ã衚ããŸãã ã¿ãã«åå
ã®èŠçŽ ã®æ°ã¯ãã¢ãªãã£ãšåŒã°ããŸãã ã¿ãã«å㯠n ⥠2 ã§ (T1 I1, ..., Tn In) æžã蟌ãŸããŸããããã§ãèå¥å I1...In ã¯ãªãã·ã§ã³ã® ã¿ãã«èŠçŽ ås ã§ãã
ã¿ãã«åå
ã®èŠçŽ åã¯ãç°ãªãååã§ããå¿
èŠããããŸãã ãã©ãŒã ItemXã®ã¿ãã«èŠçŽ å (å
é ã«ãŒãããªã 10 鲿°ã®ã·ãŒã±ã³ã¹ X ) ã¯ã Xã§ç€ºãããäœçœ®ã§ã®ã¿èš±å¯ãããŸãã
ã¡ã¢èŠçŽ åã«å¯Ÿãããã®å¶éã«ãããèŠçŽ åãšã¿ãã« ãã£ãŒã«ãåã®éã®æ··ä¹±ãåé¿ãããŸããããšãã°ãèŠçŽ å
ItemXãItemYãã£ãŒã«ãX â Yé¢é£ä»ããããŠããŸãã æ³šé
ã¡ã¢ ãªãã·ã§ã³ã®èŠçŽ åã¯ãã¿ãã«å€ã®ã©ã³ã¿ã€ã è¡šçŸ (§8.3.11.3) ã§ã¯è¡šãããŸããã
ID 倿 (§10.2.2) ã¯ãåãã¢ãªãã£ã®ã¿ãã«éã«ååšããèŠçŽ åã® ID 倿å¯èœãªã·ãŒã±ã³ã¹ããããŸãã
ã¿ãã«å€ã¯ãã¿ãã« ãªãã©ã« (§12.8.6) ããäœæããããåºã«ãªãã©ã³ã¿ã€ã è¡šçŸ (§8.3.11.3) ã䜿çšããŠçŽæ¥å€ãäœæããããšã«ãã£ãŠäœæã§ããŸãã ã¿ãã«åã®æ§æ (T1, ..., Tn) ã¯ã new æŒç®å §12.8.17.2 ã§ã¯äœ¿çšã§ããŸããã
ã¿ãã«èŠçŽ ã¯ã... Item1 ååãæã€ãããªã㯠ãã£ãŒã«ãã§ãã
ItemNã¯ã N ã¿ãã«ã¢ãªãã£ã§ãããæ°å€ã«ã¯å
è¡ãŒãããªããã¿ãã«å€ (§12.8.7) ã®ã¡ã³ã㌠ã¢ã¯ã»ã¹ãä»ããŠã¢ã¯ã»ã¹ã§ããŸãã ããã«ãã¿ãã«åã«ç¹å®ã®èŠçŽ ã®ååãããå Žåã¯ããã®ååã䜿çšããŠåé¡ã®èŠçŽ ã«ã¢ã¯ã»ã¹ã§ããŸãã
äŸ: 次ã®äŸã«ã€ããŠèããŸãã
(int, string) pair1 = (1, "One"); (int, string word) pair2 = (2, "Two"); (int number, string word) pair3 = (3, "Three"); (int Item1, string Item2) pair4 = (4, "Four"); (int Item2, string Item123) pair5 = (5, "Five"); // Error: âItemâ names do not match position Console.WriteLine($"{pair2.Item1}, {pair2.Item2}, {pair2.word}");
pair1ãpair2ããã³pair3ã®ã¿ãã«åã¯ãã¹ãŠæå¹ã§ãã¿ãã«åèŠçŽ ã®äžéšãŸãã¯ãã¹ãŠã«ååãä»ããŠããŸãã
pair4ã®ã¿ãã«åã¯ãååItem1ãšItem2ã®äœçœ®ãäžèŽããããæå¹ã§ãããååpair5ããã³Item2ã®äœçœ®ã¯äžèŽããªããããItem123ã¿ãã«åã¯èš±å¯ãããŸãããæåŸã®è¡ã¯ãã¿ãã«èŠçŽ ããã®äœçœ®ã«å¯Ÿå¿ãã
Itemåã§ã¢ã¯ã»ã¹ã§ããã ãã§ãªããåå ã«ååšããå Žåã¯å¯Ÿå¿ããã¿ãã«èŠçŽ åã§ãã¢ã¯ã»ã¹ã§ããããšã瀺ããŠããŸãã çµäºãµã³ãã«
8.3.11.2 äžéã¿ãã«ã®äœæãçç¥ãã
ã¿ãã«ãæ§ç¯ããçµæ (§12.8.6) ãæ§ç¯ãããã³ã³ããã¹ãã®å€éšã§å¿ èŠã§ãªãå Žåãä»ã®ãã¹ãŠã®ã»ãã³ãã£ãã¯èŠä»¶ãæºããããŠããã°ãå®è£ ã¯æé©åãšããŠæ§ç¯ãæç€ºçã«çç¥ã§ããŸãã
äŸ: ãã®ãããªç¶æ³ã¯ãéåžžãå²ãåœãŠã®åè§£ ($deconstructingå²ãåœãŠ)ãããã³ switch ã¹ããŒãã¡ã³ã (§13.8.3) ã«ãã£ãŠçºçããå¯èœæ§ããããŸãã åè§£å²ãåœãŠãèããŠã¿ãŸãããã
(a, b) = (b, a);å³åŽã®
(b, a)ã¯ãb&aã®å€ãå«ãã¿ãã«ãæ§ç¯ããŸãã ãã®åŸãå·ŠåŽã®åè§£å(a, b)é çªã«ããã®ã¿ãã«ã®æåã®é ç®ãéžæããŠaã«å²ãåœãŠã次㫠2 çªç®ã®é ç®ãbã«å²ãåœãŠãŸãã å šäœçãªçµæã¯ãa&bã®å€ã亀æããããã®ããã»ã¹äžã«äœæãããã¿ãã«ã¯ç Žæ£ãããŸãã ãã®ãããªäžéã¿ãã«ã®æ§ç¯ãçç¥ããããã«ããã§ä»äžãããæç€ºçãªèš±å®¹éã«ãããå®è£ ã¯ãã¿ãã« ãªãã©ã«èŠçŽ ã®å·Šããå³ãžã®è©äŸ¡é åºãæºããåbã«ãaãè©äŸ¡ããæ¹æ³ã§ 2 ã€ã®å€ã亀æã§ããŸãã ã³ãŒãã§æ¬¡ã®æé ãå®è¡ããŸãã(a, b, _) = (b, a, thing.ExpensiveMethod(x));å®è£ ã§ã¯ãã¿ãã«èŠçŽ ãé çªã«è©äŸ¡ãããå Žåãã¿ãã«ãæ§ç¯ããã« 2 ã€ã®å€ã亀æããããšãã§ããŸã(
bãaãthing.ExpensiveMethod(x))ã end ã®äŸ
泚: å®è£ ãäžéã¿ãã«ãåŒãåºãå Žåã¯ã"åé·" (广ãªã) åŒãåŒãåºãããšãã§ããŸãã ããšãã°ãäžéã¿ãã«ãæé»çãªã¿ãã«å€æã®çµæã§ããå Žåããããã®æé»çãªå€æã«ã¯å¯äœçšããªããäžéã¿ãã«ã¯äžéšã®èŠçŽ ãç Žæ£ãããåè§£ã®å¯Ÿè±¡ãšãªããç Žæ£ãããèŠçŽ ã®æé»çãªå€æãåŒãåºãããšããããŸãã æ³šé
8.3.11.3 ã©ã³ã¿ã€ã 衚çŸ
泚: é åãªã©ã®ä»ã®åãšã¯ç°ãªããã¿ãã«åã®ã©ã³ã¿ã€ã 衚çŸã¯ãžã§ããªãã¯å€åã®ã»ããã®èгç¹ããæå®ãããã¿ãã«ã¯ãã®è¡šçŸã®èгç¹ããçŽæ¥åç §ãããå¯èœæ§ããããŸãã ãã ãããããã®ãžã§ããªãã¯å€åã®ã©ã³ã¿ã€ã 衚çŸã¯ãå®è£ ã®å®çŸ©ã®ãŸãŸã§ãã æ³šé
ã¿ãã« (T1, ..., Tn) ã®ã©ã³ã¿ã€ã 衚çŸã¯ãã¢ãªã㣠2 ãã 7 ã®ã¿ãã«åã衚ããžã§ããªãã¯æ§é äœåã®ã»ããã§ãã System.ValueTuple<...> (§C.3) ã€ã³ã¹ã¿ã³ã¹ããæ§ç¯ãããŸãã ã¢ãªãã£ã 7 ãã倧ããã¿ãã«ã¯ããžã§ããªãã¯æ§é äœåSystem.ValueTuple<T1, ..., T7, TRest>ã§è¡šãããŸããã¿ãã«èŠçŽ ã«å ããŠãæ®ãã®èŠçŽ ã®å
¥ãåã«ãªã£ãRestãå«ãSystem.ValueTuple ãã£ãŒã«ãããããŸãã 1 ã€ã®è¿œå ãã£ãŒã«ãã®ã¿ãå¿
èŠãªå Žåããžã§ããªãã¯æ§é äœå System.ValueTuple<T1> ã䜿çšãããŸãããã®åèªäœã¯ã¿ãã«åãšã¯èŠãªãããŸããã ããã« 7 ã€ä»¥äžã®ãã£ãŒã«ããå¿
èŠãªå Žåã¯ãã€ã³ã¹ã¿ã³ã¹ System.ValueTuple<T1, ..., T7, TRest> å
¥ãåã«ãªããŸãã
äŸ:
(T1, T2)ã¯ã次ã§è¡šãããŸããValueTuple<T1, T2>
(T1, ..., T15)ã¯ã次ã§è¡šãããŸããValueTuple<T1, ..., T7, ValueTuple<T8, ..., T14, ValueTuple<T15>>>çµäºãµã³ãã«
ã¿ãã«ã®ã©ã³ã¿ã€ã 衚çŸã«ã¯çŽæ¥ã¢ã¯ã»ã¹ã§ããã¿ãã«ãš System.ValueTuple<...> åã¯ãæ¬¡ã®æ¡ä»¶ã«åŸã£ãŠåãæå³ã§äœ¿çšã§ããŸãã
-
(T1, ..., Tn)åã®ãã¹ãŠã®å€ã¯ãåçã®System.ValueTuple<...>å€ãšããŠæ±ãããŸãã -
System.ValueTuple<T1, T2>ãä»ããŠSystem.ValueTuple<T1, T2, T3, T4, T5, T6, T7>åã®ãã¹ãŠã®å€ã¯ãã¿ãã«å€ãéããŠåçã®(T1, T2)(T1, T2, T3, T4, T5, T6, T7)æ±ãããšãã§ããŸãã -
System.ValueTuple<T1, ..., T7, TRest>åã®å€ã¯ãTRestãã¿ãã«ãŸãã¯ä»»æã®System.ValueTuple<...>åã§ããå Žåã«ã®ã¿ã¿ãã«ãšããŠæ±ãããšãã§ããŸããåŸè ã¯System.ValueTuple<T1>ãå«ã¿ãŸãã -
System.ValueTuple<T1>åã®ãã®ä»ã®å€ã¯ãã¿ãã«ãšããŠæ±ãããšãã§ããŸããã
äžèšã®èŠä»¶ãæºãããŠããªãã¿ãã«ãšã㊠System.ValueTuple<...> å€ã䜿çšããããšãããšãã³ã³ãã€ã«æãšã©ãŒã«ãªããŸãã
泚: ãã®ãããª
System.ValueTuple<...>å€ã¯ãä»ã®æ§ç¯ãããå€ãšåæ§ã«ãæäŸããããããªã㯠ã¡ã³ããŒã䜿çšããŠã¢ã¯ã»ã¹ã§ããŸãããã¿ãã«ãšããŠã¢ã¯ã»ã¹ããããšã¯ã§ããŸããã æ³šé
äŸ: ã¿ãã« (
ValueTuple&a) ãšããŠæ±ãå Žåãšæ±ããªãc(b):var a = new ValueTuple<int, int, int, int, int, int, int>(1, 2, 3, 4, 5, 6, 7); var (a1, a2, a3, a4, a5, a6, a7) = a; // OK, a can be treated as a tuple var b = new ValueTuple<int, int, int, int, int, int, int, int> { Item1 = 1, Item2 = 2, Item3 = 3, Item4 = 4, Item5 = 5, Item6 = 6, Item7 = 7, Rest = 8 }; var b8 = b.Item8; // Error, b cannot be treated as an 8-tuple var c = new ValueTuple<int, int, int, int, int, int, int, ValueTuple<int>> (1, 2, 3, 4, 5, 6, 7, new ValueTuple<int>(8)); var c8 = c.Item8; // OK, c can be treated as a tuple and so has a field Item8çµäºãµã³ãã«
äŸ: ã¿ãã«ãš
ValueTupleã®äºææ§:(int, string) pair6 = new ValueTuple<int, string>(6, "Six"); ValueTuple<int, string> pair7 = (7, "Seven");
pair6ãšpair7ã®å®£èšã¯ãã¿ãã«ã®åãšåŒãäžè¬çã«ValueTuple<...>åãšãªããžã§ã¯ãäœæåŒ (§12.8.17.2) ãšäºææ§ãããããšã瀺ããŠããŸããçµäºãµã³ãã«
äŸ: ã¿ãã«ã®ã©ã³ã¿ã€ã 衚çŸã
System.ValueTuple<T1, ..., T7, TRest>ã®ã€ã³ã¹ã¿ã³ã¹ã䜿çšããå ŽåãRestãã£ãŒã«ãã«ã¢ã¯ã»ã¹ã§ããŸãã ããã䜿çšãããšãå€§èŠæš¡ãªã¿ãã«å ã®é ç®ãåç §ããããŸããŸãªæ¹æ³ãæäŸãããŸãã ããšãã°ã以äžã®ããã«æå®ãããšããŸããvar squares = (1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225);ãã®åŸã15 çªç®ã®æ£æ¹åœ¢ (
225) ã¯ãsquares.Item15ãsquares.Rest.Item8ãsquares.Rest.Rest.Item1ãšããŠå¯ŸåŠã§ããŸããçµäºãµã³ãã«
ã¿ãã«ãš System.ValueTuple<...> ã®å€ã¯åçãšããŠæ±ãããšãã§ããŸãããäžèšã«åŸã£ãŠãã¿ãã«åãš System.ValueTuple<...> åã®éã«ã¯éèŠãªã»ãã³ãã£ãã¯ã®éãããããŸããåè
ã®ãµããŒãã¿ãã«èŠçŽ å (§8.3.11.1) ã®ã¿ã§ãã
äŸ: èŠçŽ åããµããŒãããã®ã¯ã¿ãã«åã®æ§æã ãã§ãã ãã ããååã¯ã³ã³ãã€ã«æã®åã®äžéšã§ãããå€ã§ã¯ãªãããã
ValueTuple<...>åã®å€ãã¿ãã«ãšããŠæ±ããšãèŠçŽ åã "ã¢ã¿ãã" ã§ããŸããvar a = new ValueTuple<string, int>("Bert", 42); // Construct a ValueTuple (string name, int age) b = a; // Treat as a tuple with named elements Console.WriteLine($"{b.name} is {b.age} years old"); // Access using element namesçµäºãµã³ãã«
ãã®æšæºã®æ®ãã®éšåã§ã¯ãäžèšã§å®çŸ©ãããŠããããã«ãã¿ãã«ãš ValueTuple<...> ã®åãšå€ã®äºææ§ã¯éåžžãèªã¿åããšããŠåãããæç€ºçã«ã¯èšåãããŠããŸããã
8.3.12 null 蚱容å€å
null 蚱容å€ç
§åã¯ãåºåºãšãªãåã®ãã¹ãŠã®å€ãšè¿œå ã® null å€ã衚ããŸãã null 蚱容å€åã¯ãT? ãšèšè¿°ãããããã§ã¯ T ã¯ãåºåºåã§ãã ãã®æ§æã¯ System.Nullable<T> ã®çç¥åœ¢ã§ããã2 ã€ã®åœ¢åŒã¯äºæçã«äœ¿çšã§ããŸãã
éã«ãnull é蚱容å€åã¯ãSystem.Nullable<T> 以å€ã®ä»»æã®å€åãšãã®çç¥åœ¢ T? (ä»»æã® T ã®å Žå) ã§ãnull é蚱容å€åãšããŠå¶çŽãããä»»æã®åãã©ã¡ãŒã¿ (ã€ãŸããå€åå¶çŽ (§15.2.5) ãæã€ä»»æã®åãã©ã¡ãŒã¿) ã§ãã
System.Nullable<T> å㯠T ã®å€åã®å¶çŽãæå®ããŸããã€ãŸããnull 蚱容å€åã®åºã«ãªãåã¯ãnull é蚱容å€åã«ããããšãã§ããŸãã null 蚱容å€åã®åºã«ãªãåã¯ãnull 蚱容å€åãŸãã¯åç
§åã«ã¯ã§ããŸããã ããšãã°ãint?? ã¯ãç¡å¹ãªåã§ãã null 蚱容åç
§åã«ã€ããŠã¯ã§8.9 ãåç
§ããŠãã ããã
null 蚱容å€å T? ã®ã€ã³ã¹ã¿ã³ã¹ã«ã¯ã2 ã€ã®ãããªãã¯èªã¿åãå°çšããããã£ããããŸãã
- å
HasValueã®boolãããã㣠- å
Valueã®Tããããã£
HasValue ã true ã®ã€ã³ã¹ã¿ã³ã¹ã¯ãnull ã§ã¯ãªããšèªèãããŠããŸãã null ã§ã¯ãªã€ã³ã¹ã¿ã³ã¹ã«ã¯ãæ¢ç¥ã®å€ãå«ãŸããValue ã¯ããã®å€ãè¿ããŸãã
HasValue ã false ã®ã€ã³ã¹ã¿ã³ã¹ã¯ãnull ãšèªèãããŠããŸãã null ã€ã³ã¹ã¿ã³ã¹ã«ã¯ãæªå®çŸ©ã®å€ããããŸãã null ã€ã³ã¹ã¿ã³ã¹ã® Value ãèªã¿èŸŒãããšãããš System.InvalidOperationException ãã¹ããŒãããŸãã null 蚱容ã€ã³ã¹ã¿ã³ã¹ã® Value ããããã£ã«ã¢ã¯ã»ã¹ããããã»ã¹ã¯ãã¢ã³ã©ãããšåŒã°ããŠããŸãã
ããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ã«å ããå null 蚱容å€å T? ã«ã¯ãå T ã®åäžãã©ã¡ãŒã¿ããããããªã㯠ã³ã³ã¹ãã©ã¯ã¿ããããŸãã å x ã® å€ T ãæå®ãããå Žåã圢åŒã®ã³ã³ã¹ãã©ã¯ã¿åŒã³åºãã«ãã
new T?(x)
T? ããããã£ã Value ã§ãã x ã® null 以å€ã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããŸãã ç¹å®ã®å€ã«å¯Ÿã㊠null 蚱容å€åã® null 以å€ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããããã»ã¹ã¯ãã©ããã³ã°ãšåŒã°ããŠããŸãã
æé»çãªå€æã¯ null ãªãã©ã«ãã T? (§10.2.7) ããã³ T ãã T? (§10.2.6) ã§å©çšã§ããŸãã
null 蚱容å€å T? ã¯ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããŸãã (§19)ã ç¹ã«ãããã¯ãåºç€ãšãªãå T ãå®è£
ããã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããŠããªãããšãæå³ããŸãã
8.3.13 ããã¯ã¹åãšããã¯ã¹åè§£é€
ããã¯ã¹åãšã¢ã³ããã¯ã¹åã®æŠå¿µã¯ãå éã§å€æããã value_type ã®ä»»æã®å€ãèš±å¯ããããšã§ value_type ããã³ object éãæ©æž¡ãããŸãã ããã¯ã¹åãšã¢ã³ããã¯ã¹åã«ãããåã·ã¹ãã ã®çµ±äžããããã¥ãŒãå¯èœã«ãªããä»»æã®åã®å€ãæçµçã« object ãšããŠæ±ãããšãã§ããŸãã
ããã¯ã¹åã«ã€ããŠã¯ §10.2.9 ããã¢ã³ããã¯ã¹åã«ã€ããŠã¯ §10.3.7 ãåç §ããŠãã ããã
8.4 æ§ç¯å
8.4.1 å šè¬
ãžã§ããªãã¯å宣èšèªäœã¯ãååŒæ° s ãé©çšããããšã«ãã£ãŠãããŸããŸãªåã圢æããããã« "ãã«ãŒããªã³ã" ãšããŠäœ¿çšããããã€ã³ããããŠããªããžã§ããªãã¯åã衚ããŸãã ååŒæ°ã¯ããžã§ããªãã¯åã®ååã®çŽåŸã«å±±æ¬åŒ§ (< ããã³ >) ã§å²ãã§èšè¿°ãããŸãã å°ãªããšã 1 ã€ã®ååŒæ°ãå«ãåã¯ãæ§ç¯åãšåŒã°ããŸãã æ§ç¯åã¯ãååãåºçŸã§ããèšèªã®ã»ãšãã©ã®å Žæã§äœ¿çšã§ããŸãã æªæçžãžã§ããªãã¯å㯠typeof_expression (§12.8.18) å
ã§ã®ã¿äœ¿çšã§ããŸãã
æ§ç¯åã¯ãåŒã®äžã§åçŽãªååãšã㊠(§12.8.4) 䜿çšã§ãããŸãã¡ã³ããŒã«ã¢ã¯ã»ã¹ãããšãã«ã䜿çšã§ããŸã (§12.8.7)ã
namespace_or_type_name ãè©äŸ¡ãããéã¯ãæ£ããæ°ã®åãã©ã¡ãŒã¿ãæã€ãžã§ããªãã¯åã®ã¿ãèæ ®ãããŸãã ãããã£ãŠãåãã©ã¡ãŒã¿ã®æ°ãç°ãªãéããåãèå¥åã䜿çšããŠç°ãªãåãèå¥ããããšãã§ããŸãã ããã¯ãåãããã°ã©ã å ã§ãžã§ããªã㯠ã¯ã©ã¹ãšéãžã§ããªã㯠ã¯ã©ã¹ãæ··åšãããå Žåã«äŸ¿å©ã§ãã
äŸ:
namespace Widgets { class Queue {...} class Queue<TElement> {...} } namespace MyApplication { using Widgets; class X { Queue q1; // Non-generic Widgets.Queue Queue<int> q2; // Generic Widgets.Queue } }çµäºãµã³ãã«
namespace_or_type_nameéçšç°å¢ã§ã®ååæ€çŽ¢ã®è©³çްãªèŠåã«ã€ããŠã¯ã§7.7 ãåç
§ããŠãã ããã ãããã®çæç©ã®ææ§ãã®è§£æ±ºã«ã€ããŠã¯ã§6.2.5 ãåç
§ããŠãã ããã
type_nameã¯ãåãã©ã¡ãŒã¿ãŒãçŽæ¥æå®ããªãå Žåã§ããæ§ç¯ãããåãèå¥ã§ããŸãã ããã¯ãåããžã§ããªã㯠class 宣èšå
ã«ãã¹ãããããããå«ã宣èšã®ã€ã³ã¹ã¿ã³ã¹ã®åãååã®æ€çŽ¢ã«æé»çã«äœ¿çšãããå Žåã«çºçããå¯èœæ§ããããŸã (§15.3.9.7)ã
äŸ:
class Outer<T> { public class Inner {...} public Inner i; // Type of i is Outer<T>.Inner }çµäºãµã³ãã«
éåææ§ç¯å㯠unmanaged_type ãšããŠäœ¿çšã§ããŸãã (§8.8)ã
8.4.2 ååŒæ°
ååŒæ°ãªã¹ãã®ååŒæ°ã¯ãçŽç²ã«åã§ãã
type_argument_list
: '<' type_argument (',' type_argument)* '>'
;
type_argument
: type
| type_parameter nullable_type_annotation?
;
åååŒæ°ã¯å¯Ÿå¿ããåãã©ã¡ãŒã¿ã«å¯Ÿããå¶çŽãæºããå¿ èŠããããŸã (§15.2.5)ã null 蚱容ãåãã©ã¡ãŒã¿ãŒã® null 蚱容å€ãšäžèŽããªãåç §ååŒæ°ãå¶çŽãæºãããŸãããã ããèŠåãçºè¡ãããå¯èœæ§ããããŸãã
8.4.3 ãªãŒãã³åããã³ã¯ããŒãºãå
åã¯ãéããŠãã å ãŸã㯠éããåã§ãã ãªãŒãã³åã¯ãåãã©ã¡ãŒã¿ãå«ãåã§ãã? å ·äœçã«ã¯æ¬¡ã®ãšããã§ãã
- åãã©ã¡ãŒã¿ã¯ããªãŒãã³åãå®çŸ©ããŸãã
- é ååã¯ããã®èŠçŽ åããªãŒãã³åã®å Žåã®ã¿ããªãŒãã³åã«ãªããŸãã
- æ§ç¯åã¯ããã®ååŒæ°ã® 1 ã€ä»¥äžããªãŒãã³åã§ããå Žåã«ã®ã¿ããªãŒãã³åã«ãªããŸãã æ§ç¯ãã¹ãåã¯ããã®ååŒæ°ã® 1 ã€ä»¥äžããŸãã¯ããã«å«ãŸããåã® 1 ã€ä»¥äžã®ååŒæ°ããªãŒãã³åã§ããå Žåã«ã®ã¿ããªãŒãã³åã«ãªããŸãã
ã¯ããŒãºãåã¯ãªãŒãã³åã§ã¯ãªãåã§ãã
å®è¡æã«ããžã§ããªãã¯å宣èšå ã®ãã¹ãŠã®ã³ãŒãã¯ããžã§ããªãã¯å®£èšã«ååŒæ°ãé©çšããããšã«ãã£ãŠäœæãããã¯ããŒãºæ§ç¯åã®ã³ã³ããã¹ãã§å®è¡ãããŸãã ãžã§ããªãã¯åå ã®ååãã©ã¡ãŒã¿ã¯ãç¹å®ã®ã©ã³ã¿ã€ã åã«ãã€ã³ããããŸãã ãã¹ãŠã®ã¹ããŒãã¡ã³ããšåŒã®å®è¡æåŠçã¯åžžã«ã¯ããŒãºãåã§è¡ããããªãŒãã³åã¯ã³ã³ãã€ã«æåŠçäžã«ã®ã¿è¡ãããŸãã
åãæªæçžãžã§ããªãã¯åããæ§ç¯ããã察å¿ããååŒæ°ã®ããããã®éã«åäžæ§å€æãååšããå Žåã2 ã€ã®ã¯ããŒãºãæ§ç¯åã¯ãåäžæ§å€æå¯èœ (§10.2.2) ã§ãã 察å¿ããååŒæ°èªäœã¯ãã¯ããŒãºãæ§ç¯åããŸãã¯åäžæ§å€æå¯èœãªã¿ãã«ã§ããå ŽåããããŸãã åäžæ§å€æå¯èœãªã¯ããŒãºãæ§ç¯åã¯ãåäžã®éç倿°ã»ãããå ±æããŸãã ãã以å€ã®å Žåãããããã®ã¯ããŒãºãæ§ç¯åã«ã¯ç¬èªã®éç倿°ã®ã»ãããååšããŸãã ãªãŒãã³åã¯å®è¡æã«ã¯ååšããªãããããªãŒãã³åã«é¢é£ä»ããããéç倿°ã¯ååšããŸããã
8.4.4 æçžåããã³æªæçžå
æªæçžåãšããçšèªã¯ãéãžã§ããªãã¯åãŸãã¯æªæçžãžã§ããªãã¯åãæããŸãã æçžåãšããçšèªã¯ãéãžã§ããªãã¯åãŸãã¯æ§ç¯åãæããŸãã
æªæçžåã¯ãå宣èšã«ãã£ãŠå®£èšããããšã³ãã£ãã£ãæããŸãã æªæçžãžã§ããªãã¯åèªäœã¯ãåã§ã¯ãªãã倿°ã®åãåŒæ°ãŸãã¯æ»ãå€ãŸãã¯åºåºåãšããŠäœ¿çšã§ããŸããã æªæçžãžã§ããªãã¯åãåç
§ã§ããå¯äžã®æ§é ã¯ãtypeof åŒã§ã (§12.8.18)ã
8.4.5 å¶çŽãæºãã
æ§ç¯åãŸãã¯ãžã§ããªã㯠ã¡ãœãããåç
§ããããã³ã«ãæå®ã®ååŒæ°ã¯ãžã§ããªãã¯åãŸãã¯ã¡ãœããã§å®£èšãããåãã©ã¡ãŒã¿å¶çŽãšç
§åããŸã (§15.2.5)ã å where å¥ã®å Žåãååä»ãåãã©ã¡ãŒã¿ã«å¯Ÿå¿ããååŒæ° A ãæ¬¡ã®ããã«åå¶çŽã«å¯ŸããŠãã§ãã¯ãããŸãã
- å¶çŽã
classåãã€ã³ã¿ãŒãã§ã€ã¹åããŸãã¯åãã©ã¡ãŒã¿ã§ããå Žåãå¶çŽå ã«çŸããåãã©ã¡ãŒã¿ã®ä»£ããã«æå®ãããååŒæ°ã䜿çšããŠããã®å¶çŽãCã§è¡šããŸãã å¶çŽãæºããã«ã¯ãåAãæ¬¡ã®ããããã«ãã£ãŠåCã«å€æå¯èœã§ãªããã°ãªããŸããã - å¶çŽãåç
§åå¶çŽ (
class) ã®å ŽåãåAã¯æ¬¡ã®ãããããæºããå¿ èŠããããŸãã-
Aã¯ãã€ã³ã¿ãŒãã§ã€ã¹åãã¯ã©ã¹åãããªã²ãŒãåãé ååããŸãã¯åçåã§ãã
泚:
System.ValueTypeããã³System.Enumã¯ãã®å¶çŽãæºããåç §åã§ãã æ³šé-
Aã¯ãåç §åãšããŠç¥ãããŠããåãã©ã¡ãŒã¿ã§ã (§8.2)ã
-
- å¶çŽãå€åå¶çŽ (
struct) ã®å ŽåãåAã¯æ¬¡ã®ãããããæºããå¿ èŠããããŸãã-
Aã¯ãstructåãŸãã¯enumã§ãããnull 蚱容å€åã§ã¯ãããŸããã
泚:
System.ValueTypeããã³System.Enumã¯ãã®å¶çŽãæºãããªãåç §åã§ãã æ³šé-
Aã¯ãå€åå¶çŽãããåãã©ã¡ãŒã¿ã§ã (§15.2.5)ã
-
- å¶çŽãã³ã³ã¹ãã©ã¯ã¿ãŒå¶çŽ
new()å ŽåãAåã¯abstractããããå¿ èŠãªã¡ã³ã㌠ãªã¹ã (§15.7.1) ãæããªãããã«ãããã©ã¡ãŒã¿ãŒãªãã®ãããªã㯠ã³ã³ã¹ãã©ã¯ã¿ãŒãæã€å¿ èŠããããŸãã ããã¯ã次ã®ããããã True ã®å Žåã«æºããããŸãã-
Aã¯ããã¹ãŠã®å€åã«ãããªãã¯ã®ããã©ã«ã ã³ã³ã¹ãã©ã¯ã¿ããããããå€åã§ã (§8.3.3)ã -
Aã¯ãã³ã³ã¹ãã©ã¯ã¿å¶çŽãããåãã©ã¡ãŒã¿ã§ã (§15.2.5)ã -
Aã¯ãå€åå¶çŽãããåãã©ã¡ãŒã¿ã§ã (§15.2.5)ã -
Aã¯ãã¯æœè±¡çã§ã¯ãªãããã©ã¡ãŒã¿ãªãã§æç€ºçã«å®£èšããããããªã㯠ã³ã³ã¹ãã©ã¯ã¿ãå«ãclassã§ãã -
Aã¯ãabstractã§ã¯ãªããããã©ã«ã ã³ã³ã¹ãã©ã¯ã¿ããããŸã (§15.11.5)ã
-
æå®ãããååŒæ°ã«ãã£ãŠåãã©ã¡ãŒã¿ã®å¶çŽã® 1 ã€ä»¥äžãæºããããªãå Žåãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
åãã©ã¡ãŒã¿ã¯ç¶æ¿ãããªããããå¶çŽãç¶æ¿ãããŸããã
äŸ: 以äžã§ã¯ã
Dã¯åãã©ã¡ãŒã¿Tã«å¶çŽãæå®ããŠãTãclassB<T>åºåºã¯ã©ã¹ã«ãã£ãŠèª²ãããå¶çŽãæºããããã«ããå¿ èŠããããŸãã å¯Ÿç §çã«ãclassã¯ä»»æã®Eã«å¯ŸããŠList<T>ãå®è£ ãããããIEnumerableTã¯å¶çŽãæå®ããå¿ èŠã¯ãããŸãããclass B<T> where T: IEnumerable {...} class D<T> : B<T> where T: IEnumerable {...} class E<T> : B<List<T>> {...}çµäºãµã³ãã«
8.5 åãã©ã¡ãŒã¿ãŒ
åãã©ã¡ãŒã¿ã¯ãå®è¡æã«ãã©ã¡ãŒã¿ããã€ã³ããããå€åãŸãã¯åç §åãæå®ããèå¥åã§ãã
type_parameter
: identifier
;
åãã©ã¡ãŒã¿ã¯ããŸããŸãªååŒæ°ã䜿çšããŠã€ã³ã¹ã¿ã³ã¹åã§ãããããåãã©ã¡ãŒã¿ã«ã¯ä»ã®åãšè¥å¹²ç°ãªãæäœãšå¶éããããŸãã
泚: ããã«ã¯æ¬¡ãå«ãŸããŸãã
- åºåºã¯ã©ã¹ (§15.2.4.2) ãŸãã¯ã€ã³ã¿ãŒãã§ã€ã¹ (§19.2.4) ã宣èšããããã«åãã©ã¡ãŒã¿ãŒãçŽæ¥äœ¿çšããããšã¯ã§ããŸããã
- åãã©ã¡ãŒã¿ã®ã¡ã³ããŒæ€çŽ¢ã®ã«ãŒã«ã¯ãåãã©ã¡ãŒã¿ã«é©çšãããå¶çŽ (ååšããå Žå) ã«ãã£ãŠç°ãªããŸãã 詳现ã«ã€ããŠã¯ã§12.5 ãåç §ããŠãã ããã
- åãã©ã¡ãŒã¿ã«äœ¿çšã§ãã倿ã¯ãåãã©ã¡ãŒã¿ã«é©çšãããå¶çŽ (ååšããå Žå) ã«ãã£ãŠç°ãªããŸãã 詳现ã«ã€ããŠã¯ã§10.2.12 ãã㳠§10.3.8 ãåç §ããŠãã ããã
- åãã©ã¡ãŒã¿ãåç §åã§ããããšãåãã£ãŠããå Žåãé€ãããªãã©ã«
nullã¯åãã©ã¡ãŒã¿ã«ãã£ãŠæå®ãããåã«å€æã§ããŸãã (§10.2.12)ã ãã ãã代ããã«ããã©ã«ãåŒ (§12.8.21) ã䜿çšããããšãã§ããŸãã ããã«ãåãã©ã¡ãŒã¿ãŒã«ãã£ãŠæå®ãããåãæã€å€ã¯ãåãã©ã¡ãŒã¿ãŒã«å€åå¶çŽããªãéãããš==(!=) ã䜿çšã㊠null ãšæ¯èŒã§ããŸããnewåŒ (§12.8.17.2) ã¯ãåãã©ã¡ãŒã¿ã constructor_constraint ãŸãã¯å€åå¶çŽ (§15.2.5) ã«ãã£ãŠå¶çŽãããŠããå Žåã«ã®ã¿ãåãã©ã¡ãŒã¿ã§äœ¿çšã§ããŸãã- åãã©ã¡ãŒã¿ãŒã¯ã屿§ (§23.2.1) å ã®ã©ãã«ã䜿çšã§ããŸããã
- ã¡ã³ã㌠ã¢ã¯ã»ã¹ (§12.8.7) ãŸãã¯åå (§7.7) ã§åãã©ã¡ãŒã¿ãŒã䜿çšããŠãéçã¡ã³ããŒãŸãã¯å ¥ãåã«ãªã£ãåãèå¥ããããšã¯ã§ããŸããã
- åãã©ã¡ãŒã¿ãŒã¯ãåãã©ã¡ãŒã¿ãŒãã¢ã³ãããŒãžå¶çŽ (§15.2.5) ã«ãã£ãŠå¶çŽãããŠããå Žåã«ã®ã¿ãunmanaged_type (§8.8) ãšããŠäœ¿çšã§ããŸãã
- åãã©ã¡ãŒã¿ãŒãå€åã«æç€ºçã«å¶çŽãããŠããå Žåãé€ããnull 蚱容泚é (
?) ã¯ãnull 蚱容泚éãã©ã°ãæå¹ã«ãªã£ãŠããå Žå (§6.5.9ã §15.2.5) ã®å Žåã«ã®ã¿ãåãã©ã¡ãŒã¿ãŒã®åºçŸã«é©çšã§ããŸããæ³šé
åãšããŠãåãã©ã¡ãŒã¿ã¯çŽç²ã«ã³ã³ãã€ã«æã®æ§æèŠçŽ ã§ãã å®è¡æã«ãååãã©ã¡ãŒã¿ã¯ããžã§ããªãã¯å宣èšã«ååŒæ°ãæäŸããããšã«ãã£ãŠæå®ãããå®è¡æåã«ãã€ã³ããããŸãã ãããã£ãŠãåãã©ã¡ãŒã¿ã§å®£èšããã倿°ã®åã¯ãå®è¡æã«éããæ§ç¯åã«ãªããŸã §8.4.3ã åãã©ã¡ãŒã¿ãå«ããã¹ãŠã®ã¹ããŒãã¡ã³ããšåŒã®å®è¡æå®è¡ã§ã¯ããã®ãã©ã¡ãŒã¿ã®ååŒæ°ãšããŠæå®ãããåã䜿çšãããŸãã
8.6 åŒããªãŒå
åŒããªãŒã䜿çšãããšãã©ã ãåŒãå®è¡å¯èœã³ãŒãã§ã¯ãªãããŒã¿æ§é ãšããŠè¡šãããšãã§ããããã«ãªããŸãã åŒããªãŒã¯ããã©ãŒã ã®ã®å€ã§ãããSystem.Linq.Expressions.Expression<TDelegate>ã¯ä»»æã®ããªã²ãŒãåã§ãã ãã®ä»æ§ã®æ®ãã®éšåã§ã¯ããããã®åã¯çç¥åœ¢ Expression<TDelegate> ã䜿çšããŠåç
§ãããŸãã
ã©ã ãåŒããããªã²ãŒãå D ãžã®å€æãååšããå ŽåãåŒããªãŒå Expression<TDelegate> ãžã®å€æãååšããŸãã ã©ã ãåŒãããªã²ãŒãåã«å€æãããšãã©ã ãåŒã®å®è¡å¯èœã³ãŒããåç
§ããããªã²ãŒããçæãããŸãããåŒããªãŒåã«å€æãããšãã©ã ãåŒã®åŒããªãŒè¡šçŸãäœæãããŸãã ãã®å€æã«é¢ãã詳现ã«ã€ããŠã¯ã§10.7.3 ãåç
§ããŠãã ããã
äŸ: 次ã®ããã°ã©ã ã¯ãã©ã ãåŒãå®è¡å¯èœã³ãŒããšåŒããªãŒã®äž¡æ¹ãšããŠè¡šããŸãã
Func<int,int>ãžã®å€æãååšãããããExpression<Func<int,int>>ãžã®å€æãååšããŸããFunc<int,int> del = x => x + 1; // Code Expression<Func<int,int>> exp = x => x + 1; // Dataãããã®å²ãåœãŠã«ç¶ããŠãããªã²ãŒã
delã¯x + 1ãè¿ãã¡ãœãããåç §ããåŒããªãŒ exp ã¯åŒx => x + 1ãèšè¿°ããããŒã¿æ§é ãåç §ããŸããçµäºãµã³ãã«
Expression<TDelegate> ã¯ãã€ã³ã¹ã¿ã³ã¹ ã¡ãœãã Compile ãæå®ããŸããããã¯ããªã²ãŒãå TDelegate ãçæããŸãã
Func<int,int> del2 = exp.Compile();
ãã®ããªã²ãŒããåŒã³åºãããšã§ãåŒããªãŒã§è¡šãããã³ãŒããå®è¡ãããŸãã ãããã£ãŠãäžèšã®å®çŸ©ã«ããã°ãdel ãš del2 ã¯åçã§ãããæ¬¡ã® 2 ã€ã®ã¹ããŒãã¡ã³ãã¯åã广ãæã¡ãŸãã
int i1 = del(1);
int i2 = del2(1);
ãã®ã³ãŒããå®è¡åŸãi1 ãš i2 ã¯äž¡æ¹ãšããå€ 2 ãæã¡ãŸãã
Expression<TDelegate> ãæå®ãã API ãµãŒãã§ã¹ã¯ãäžèšã® Compile ã¡ãœããã®èŠä»¶ãè¶
ããåŠçç³»å®çŸ©ã§ãã
泚: åŒããªãŒã«æäŸããã API ã®è©³çްã¯åŠçç³»å®çŸ©ã§ãããå®è£ ã¯æ¬¡ã®ããã«æ³å®ãããŸãã
- ã©ã ãåŒããã®å€æã®çµæãšããŠäœæãããåŒããªãŒã®æ§é ãã³ãŒããæ€æ»ããŠå¿çã§ããããã«ããŸãã
- ãŠãŒã¶ãŒ ã³ãŒãå ã§åŒããªãŒãããã°ã©ã ã§äœæã§ããããã«ãã
泚é
8.7 åçå
å dynamic ã¯ãä»ã®ãã¹ãŠã®åã§äœ¿çšãããéçãã€ã³ãã£ã³ã°ãšã¯å¯Ÿç
§çã«ã§12.3.2 ã§è©³çްã«èª¬æãããŠããåçãã€ã³ãã£ã³ã°ã䜿çšããŸãã
å dynamic ã¯ã次ã®ç¹ãé€ã㊠object ãšåäžã§ãããšèŠãªãããŸãã
- å
dynamicã®åŒã«å¯ŸããæŒç®ã¯åçã«ãã€ã³ãã§ããŸã (§12.3.3)ã - äž¡æ¹ãåè£ã§ããå Žåãåæšè« (§12.6.3) ã¯ã
dynamicããobjectãåªå ããŸãã -
dynamicã¯ã以äžãšããŠäœ¿çšã§ããŸããã- object_creation_expression ã®å (§12.8.17.2)
- class_base (§15.2.4)
- member_access 㮠predefined_type (§12.8.7.1)
-
typeofæŒç®åã®ãªãã©ã³ã - 屿§åŒæ°
- å¶çŽ
- æ¡åŒµã¡ãœããå
- struct_interfaces (§16.2.5) ãŸã㯠interface_type_list å ã®ååŒæ°ã®äžéš (§15.2.4.1)ã
ãã®åçæ§ã®ãããæ¬¡ã®ããšãæãç«ã¡ãŸãã
- æé»ç ID 倿ããã
-
objectããdynamicã®é -
dynamicãobjectã«çœ®ãæããéãšåãæ§ç¯åé -
dynamicãobjectã«çœ®ãæããéãšåãã¿ãã«åé
-
-
objectãšã®éã®æé»çããã³æç€ºçãªå€æã¯ãdynamicãšã®éã§ãé©çšãããŸãã -
dynamicãobjectã«çœ®ãæãããšãã«åã眲åã¯ãåã眲åãšã¿ãªãããŸãã - å®è¡æã«ã¯å
dynamicãšåobjectã¯åºå¥ã§ããŸããã - å
dynamicã®åŒã¯åçåŒãšåŒã°ããŸãã
8.8 ã¢ã³ãããŒãžå
unmanaged_type
: value_type
| pointer_type // unsafe code support
;
unmanaged_type ã¯ãreference_type ã§ã type_parameter ã§ããªããã¢ã³ãããŒãžãã«å¶çŽãããŠããããåã unmanaged_typeã§ã¯ãªãã€ã³ã¹ã¿ã³ã¹ ãã£ãŒã«ããå«ãŸãªãåã§ãã ã€ãŸããunmanaged_type ã¯æ¬¡ã®ããããã«ãªããŸãã
-
sbyteãbyteãshortãushortãintãuintãnintãnuintãlongãulongãcharãfloatãdoubleãdecimalããŸãã¯boolã - ãã¹ãŠã® enum_typeã
- unmanaged_type ã®ã€ã³ã¹ã¿ã³ã¹ ãã£ãŒã«ãã®ã¿ãå«ãããŠãŒã¶ãŒå®çŸ©ã® struct_typeã
- ã¢ã³ãããŒãžãã§ããããšãå¶çŽãšããä»»æã®åãã©ã¡ãŒã¿ãŒã
- ä»»æ ã®pointer_type (§24.3)ã
8.9 åç §åããã³ null å¯èœæ§
8.9.1 å šè¬
null 蚱容åç
§åã¯ãnullable_type_annotation (?) ã null é蚱容åç
§åã«è¿œå ããããšã§ããããããŸãã null é蚱容åç
§åãšããã«å¯Ÿå¿ãã null å€èš±å®¹åã®éã«ã¯æå³çãªéãã¯ãªããã©ã¡ãããªããžã§ã¯ããŸã㯠null ãžã®åç
§ã«ãªããŸãã
nullable_type_annotation ã®æç¡ã¯ãåŒã null å€ãèš±å¯ãããã©ããã宣èšããŸãã åŒããã®æå³ã«åŸã£ãŠäœ¿çšãããŠããªãå Žåãã³ã³ãã€ã©ã¯èšºæãæäŸããããšããããŸãã åŒã® null ç¶æ
ã«ã€ããŠã¯ã§8.9.5 ã§å®çŸ©ãããŠããŸãã null 蚱容åç
§åãšããã«å¯Ÿå¿ãã null é蚱容åç
§åã®éã«ã¯åäžæ§å€æãååšããŸã (§10.2.2)ã
åç §åã«ã¯ã2 ã€ã®åœ¢åŒã® null å¯èœæ§ããããŸãã
-
null 蚱容: null 蚱容åç
§ ã«ã¯ã
nullå€ãå²ãåœãŠãããšãã§ããŸãã ããã©ã«ãã® null ç¶æ ã¯ãmaybe-null ã§ãã -
non-nullable: non-nullable reference ã
nullå€ã«å²ãåœãŠãããšã¯ã§ããŸããã ããã©ã«ãã® null ç¶æ ã¯ãnot-null ã§ãã
泚: å
Rããã³R?ã¯ãåãåºã«ãªãåRã§è¡šãããŸãã ãã®åºã«ãªãåã®å€æ°ã«ã¯ããªããžã§ã¯ããžã®åç §ãå«ãŸãããããŸãã¯ãåç §ãªããã瀺ãå€nullã«ãªããŸãã æ³šé
null 蚱容åç §åãšããã«å¯Ÿå¿ãã null é蚱容åç §åã®æ§æäžã®åºå¥ã«ãããã³ã³ãã€ã©ã¯èšºæãçæã§ããŸãã ã³ã³ãã€ã©ã¯ã§8.2.1 ã§å®çŸ©ãããŠãã nullable_type_annotation ãèš±å¯ããå¿ èŠããããŸãã 蚺æã¯èŠåã«éå®ããå¿ èŠããããŸãã é ååã®æå³ä»¥å€ã§ã¯ãnull 蚱容泚éã®æç¡ãããã³ null 蚱容ã³ã³ããã¹ãã®ç¶æ ã®ãããããã³ã³ãã€ã«æã«çæããã蚺æã¡ãã»ãŒãžã®å€æŽãé€ããããã°ã©ã ã®ã³ã³ãã€ã«æãŸãã¯å®è¡æã®åäœã倿Žããããšã¯ã§ããŸããã
é ååã®æå³ã¯ã§17.2.1 ã§èª¬æãããŠããããã«ãarray_typeå ã«nullable_type_annotationãååšããããšã§å€§ããªåœ±é¿ãåããŸãã
8.9.2 null é蚱容åç §å
null é蚱容åç
§å ã¯ãT 圢åŒã®åç
§åã§ãããã§ã¯ãT ã¯ãååã§ãã null é倿°ã®ããã©ã«ãã® null ç¶æ
ã¯ãnot-null ã§ãã
null ã§ãªãå€ãå¿
èŠãªå Žæã§maybe-null ã§ããåŒã䜿çšããããšèŠåã衚瀺ãããå ŽåããããŸãã
8.9.3 null 蚱容åç §å
T? ãªã©ã® åœ¢åŒ string? ã®åç
§åã¯ãnull 蚱容åç
§åã§ãã null èš±å®¹å€æ°ã®ããã©ã«ãã® null ç¶æ
ã¯ãmaybe null ã§ãã æ³šé ? ã¯ããã®åã null 蚱容ã§ããããšã瀺ããŸãã ã³ã³ãã€ã©ã¯ãããã®æå³ãèªèããŠèŠåãçºè¡ã§ããŸãã null 蚱容泚éã³ã³ããã¹ããç¡å¹ã«ãªã£ãŠããå Žåããã®æ³šéã䜿çšãããšèŠåãçæãããããšããããŸãã
8.9.4 null 蚱容ã³ã³ããã¹ã
8.9.4.1 å šè¬
ãœãŒã¹ ã³ãŒãã®åè¡ã«ã¯ãnull 蚱容ã³ã³ããã¹ãããããŸãã null 蚱容ã³ã³ããã¹ãã®æ³šéãšèŠåãã©ã°ã¯ããããã null 蚱容泚é (§8.9.4.3) ãš null 蚱容èŠå (§8.9.4.4) ãå¶åŸ¡ããŸãã åãã©ã°ã¯ãæå¹ãŸãã¯ç¡å¹ã§ãã ã³ã³ãã€ã©ã¯ãéçãããŒåæã䜿çšããŠãä»»æã®åç §å€æ°ã® null ç¶æ ã倿ã§ããŸãã åç §å€æ°ã® null ç¶æ (§8.9.5)ã¯ãnot nullãmaybe nullãmaybe default ã®ãããããšãªããŸãã
null 蚱容ã³ã³ããã¹ãã¯ãnull 蚱容ãã£ã¬ã¯ãã£ã (§6.5.9) ãä»ããŠãœãŒã¹ ã³ãŒãå ã§æå®ããããšãããœãŒã¹ ã³ãŒãã®å€éšã«ããå®è£ åºæã®ã¡ã«ããºã ãä»ããŠæå®ããããšãã§ããŸãã äž¡æ¹ã®ã¢ãããŒãã䜿çšããå Žåãnull 蚱容ãã£ã¬ã¯ãã£ãã¯å€éšã¡ã«ããºã ãä»ããŠè¡ãããèšå®ãåªå ããŸãã
null 蚱容ã³ã³ããã¹ãã®ããã©ã«ãã®ç¶æ ã¯åŠçç³»å®çŸ©ã§ãã
ãã®ä»æ§å šäœãéããŠãnull 蚱容ãã£ã¬ã¯ãã£ããå«ãŸããŠããªãããŸãã¯çŸåšã® null 蚱容ã³ã³ããã¹ãã®ç¶æ ã«é¢ããŠäœãèšè¿°ãããŠããªããã¹ãŠã® C# ã³ãŒãã¯ã泚éãšèŠåã®äž¡æ¹ãæå¹ã«ãªã£ãŠãã null 蚱容ã³ã³ããã¹ãã䜿çšããŠã³ã³ãã€ã«ãããŠãããã®ãšæ³å®ãããŸãã
泚: äž¡æ¹ã®ãã©ã°ãç¡å¹ã«ãªã£ãŠãã null 蚱容ã³ã³ããã¹ãã¯ãåç §åã®ä»¥åã®æšæºåäœãšäžèŽããŸãã æ³šé
nullable_type_annotation ã䜿çšããŠå®£èšãããé ååã®ã©ã³ã¯ãšèŠçŽ ã¯ãnull 蚱容ã³ã³ããã¹ã (§8.9.4) ã®åœ±é¿ãåããŸããã
8.9.4.2 ç¡å¹ãª null 蚱容
èŠåãã©ã°ãšæ³šéãã©ã°ã®äž¡æ¹ãç¡å¹ã«ãªã£ãŠããå Žåãnull 蚱容ã³ã³ããã¹ãã¯ç¡å¹ã«ãªããŸãã
null 蚱容ã³ã³ããã¹ããç¡å¹ã®å Žå:
- 泚éã®ãªãåç
§åã®å€æ°ã
nullã§åæåããããããŸãã¯ãã®å€ãå²ãåœãŠãããå ŽåãèŠåã¯çæãããŸããã - åç §åã®å€æ°ã null å€ãæã€å¯èœæ§ãããå ŽåãèŠåã¯çæãããŸããã
- åç
§å
Tã®å Žåã?ã®æ³šéT?ã¯ãã¡ãã»ãŒãžãçæããåT?ã¯ãTãšåãã«ãªããŸãã - ä»»æã®åãã©ã¡ãŒã¿å¶çŽ
where T : C?ã®å Žåã?ã®æ³šéC?ã¯ãã¡ãã»ãŒãžãçæããC?ã¯ãCãšåãã«ãªããŸãã - ä»»æã®åãã©ã¡ãŒã¿å¶çŽ
where T : U?ã®å Žåã?ã®æ³šéU?ã¯ãã¡ãã»ãŒãžãçæããU?ã¯ãUãšåãã«ãªããŸãã - ãžã§ããªãã¯å¶çŽ
class?ã¯ãèŠåã¡ãã»ãŒãžãçæããŸãã åãã©ã¡ãŒã¿ã¯ãåç §åã«ããå¿ èŠããããŸããæ³š: ãã®ã¡ãã»ãŒãžã¯ãé¢é£ã®ãªã null 蚱容èŠåèšå®ã®ç¶æ ãšã®æ··åãé¿ããããããèŠåãã§ã¯ãªããæ å ±ããšããŠç¹åŸŽä»ããããŠããŸãã æ³šé
- null 蚱容æŒç®å
!(§12.8.9) ã«ã¯å¹æã¯ãããŸããã
äŸ:
#nullable disable annotations string? s1 = null; // Informational message; ? is ignored string s2 = null; // OK; null initialization of a reference s2 = null; // OK; null assignment to a reference char c1 = s2[1]; // OK; no warning on dereference of a possible null; // throws NullReferenceException c1 = s2![1]; // OK; ! is ignoredçµäºãµã³ãã«
8.9.4.3 null 蚱容泚é
èŠåãã©ã°ãç¡å¹ã§ã泚éãã©ã°ãæå¹ã«ãªã£ãŠããå Žåãnull 蚱容ã³ã³ããã¹ãã¯ã泚éã§ãã
null 蚱容ã³ã³ããã¹ããæ³šéã®å Žå:
- ä»»æã®åç
§å
Tã®å Žåã?ã®æ³šéT?ã¯ãT?ã null 蚱容åã§ããããšã瀺ããŸãããæ³šéãç¡ãTã¯ãnull é蚱容åã§ãã - null å¯èœæ§ã«é¢é£ãã蚺æèŠåã¯çæãããŸããã
- null 蚱容æŒç®å
!(§12.8.9) ã¯ããã®ãªãã©ã³ãã®åæããã null ç¶æ ãšãçæãããã³ã³ãã€ã«æã®èšºæèŠåã倿Žããå ŽåããããŸãã
äŸ:
#nullable disable warnings #nullable enable annotations string? s1 = null; // OK; ? makes s2 nullable string s2 = null; // OK; warnings are disabled s2 = null; // OK; warnings are disabled char c1 = s2[1]; // OK; warnings are disabled; throws NullReferenceException c1 = s2![1]; // No warningsçµäºãµã³ãã«
8.9.4.4 null 蚱容ã®èŠå
èŠåãã©ã°ãæå¹ã§ã泚éãã©ã°ãç¡å¹ã«ãªã£ãŠããå Žåãnull 蚱容ã³ã³ããã¹ãã¯ãèŠåã§ãã
null 蚱容ã³ã³ããã¹ãããèŠåã®å Žåãã³ã³ãã€ã©ã¯ã次ã®ã±ãŒã¹ã§èšºæãçæããŸãã
- maybe null ã§ãããšå€æãããåç §å€æ°ãéåç §ãããŸãã
- null é蚱容åã®åç §å€æ°ã¯ãmaybe null ã®åŒã«å²ãåœãŠãããŸãã
-
?ã¯ãnull 蚱容åç §åã§ããããšã瀺ãããã«äœ¿çšãããŸãã - null 蚱容æŒç®å
!(§12.8.9) ã䜿çšãããšããã®ãªãã©ã³ãã® null ç¶æ ã not null ã«èšå®ã§ããŸãã
äŸ:
#nullable disable annotations #nullable enable warnings string? s1 = null; // OK; ? makes s2 nullable string s2 = null; // OK; null-state of s2 is "maybe null" s2 = null; // OK; null-state of s2 is "maybe null" char c1 = s2[1]; // Warning; dereference of a possible null; // throws NullReferenceException c1 = s2![1]; // The warning is suppressedçµäºãµã³ãã«
8.9.4.5 æå¹ãª null 蚱容
èŠåãã©ã°ãšæ³šéãã©ã°ã®äž¡æ¹ãæå¹ãªå Žåãnull 蚱容ã³ã³ããã¹ãã¯æå¹ã«ãªããŸãã
null 蚱容ã³ã³ããã¹ããæå¹ã®å Žå:
- ä»»æã®åç
§å
Tã®å Žåã?ã®æ³šéT?ã¯ãT?ã null 蚱容åã«ããŸãããæ³šéãç¡ãTã¯ãnull é蚱容åã§ãã - ã³ã³ãã€ã©ã¯ãéçãããŒåæã䜿çšããŠãä»»æã®åç §å€æ°ã® null ç¶æ ã倿ã§ããŸãã null 蚱容èŠåãæå¹ã§ããå Žåãåç §å€æ°ã® null ç¶æ (§8.9.5) ã¯ãnot nullãmaybe nullãmaybe default ã®ããããã«ãªããŸãã
- null 蚱容æŒç®å
!(§12.8.9) ã¯ããã®ãªãã©ã³ãã® null ç¶æ ã not null ã«èšå®ããŸãã - åãã©ã¡ãŒã¿ãŒã® null 蚱容ã察å¿ããååŒæ°ã® null 蚱容å€ãšäžèŽããªãå Žåãã³ã³ãã€ã©ã¯èŠåãçºè¡ã§ããŸãã
8.9.5 null å¯èœæ§ãš null ç¶æ
8.9.5.1 å šè¬
ã³ã³ãã€ã©ã¯éçåæãå®è¡ããå¿ èŠã¯ãªããnull å¯èœæ§ã«é¢é£ãã蚺æèŠåãçæããå¿ èŠããããŸããã
ãã®ãµãå¥ã®æ®ãã®éšåã¯æ¡ä»¶ä»ãèŠç¯ã§ãã
8.9.5.2 ãããŒåæ
蚺æèŠåãçæããã³ã³ãã€ã©ã¯ãããã®èŠåã«æºæ ããŸãã
ãã¹ãŠã®åŒã«ã¯ã次㮠3 ã€ã® null ç¶æ ããããŸãã
- maybe null: åŒã®å€ã¯ null ãšè©äŸ¡ãããå ŽåããããŸãã
- maybe default: åŒã®å€ã¯ããã®åã®ããã©ã«ãå€ã«è©äŸ¡ãããå ŽåããããŸãã
- not null: åŒã®å€ã¯ null ã§ã¯ãããŸããã
åŒã®ããã©ã«ãã® null ç¶æ ã¯ããã®åãšãå®£èšæã®æ³šéãã©ã°ã®ç¶æ ã«ãã£ãŠæ±ºãŸããŸãã
-
nullãªãã©ã« (§6.4.5.7) ã®æ¢å®ã®ç¶æ 㯠null ã§ããå¯èœæ§ããããŸãã - æ¢å®å€ã®åŒ (§12.8.21) ã®æ¢å®ã®ç¶æ ã¯ãåã null é蚱容å€åã®å Žå㯠null ã§ã¯ãããŸããããã以å€ã®å Žå㯠null ã§ãã
- ãã®ä»ã®ãã¹ãŠã®åŒã®å Žå:
- åã null 蚱容åç
§åã§ããåŒã®æ¢å®ã® null ç¶æ
ã¯æ¬¡ã®ãšããã§ãã
- 泚éãã©ã°ãæå¹ã«ãªã£ãŠããããã¹ãå ã§å®£èšãããŠããå Žåã¯ãMaybe null ã§ãã
- 泚éãã©ã°ãç¡å¹ã«ãªã£ãŠããããã¹ãå ã§å®£èšãããŠããå Žåã¯ãNot null ã§ãã
- åã null é蚱容åç §åã§ããåŒã®æ¢å®ã® null ç¶æ 㯠null ã§ã¯ãããŸããã
- åã null 蚱容åç
§åã§ããåŒã®æ¢å®ã® null ç¶æ
ã¯æ¬¡ã®ãšããã§ãã
泚:maybe default ç¶æ ã¯ãåã
stringãªã©ã® null é蚱容åã§ãããåŒdefault(T)ã null å€ã§ããå Žåã«ãå¶çŽã®ãªãåãã©ã¡ãŒã¿ã§äœ¿çšãããŸãã null 㯠null é蚱容åã®ãã¡ã€ã³å ã«ãªããããç¶æ ã¯ããããããã©ã«ãã§ãã æ³šé
泚éãã©ã°ãæå¹ã«ãªã£ãŠããããã¹ãã§ãã®å€æ°ã宣èšãããŠãããšãã«ãnull é蚱容åç §åã®å€æ° (§9.2.1) ãåæåãããããmaybe null ã®åŒã«å²ãåœãŠããããšã蚺æãçæãããŸãã
äŸ: ãã©ã¡ãŒã¿ã null 蚱容ã§ããããã®å€ã null é蚱容åã«å²ãåœãŠãããŠããæ¬¡ã®ã¡ãœãããæ€èšããŸãã
#nullable enable public class C { public void M(string? p) { // Warning: Assignment of maybe null value to non-nullable variable string s = p; } }
ã³ã³ãã€ã©ã¯ãnull ã§ããå¯èœæ§ããããã©ã¡ãŒã¿ãŒã null ã§ã¯ãªã倿°ã«å²ãåœãŠãããèŠåãçºè¡ããããšããããŸãã å²ãåœãŠåã«ãã©ã¡ãŒã¿ãŒã null ãã§ãã¯ãããŠããå Žåãã³ã³ãã€ã©ã¯ null èš±å®¹ç¶æ åæã§ãã©ã¡ãŒã¿ãŒã䜿çšããèŠåãçºè¡ããªãå¯èœæ§ããããŸãã
#nullable enable public class C { public void M(string? p) { if (p != null) { string s = p; // No warning // Use s } } }çµäºãµã³ãã«
ã³ã³ãã€ã©ã¯ãåæã®äžç°ãšããŠå€æ°ã® null ç¶æ ãæŽæ°ã§ããŸãã
äŸ: ã³ã³ãã€ã©ã¯ãããã°ã©ã å ã®ã¹ããŒãã¡ã³ãã«åºã¥ããŠç¶æ ãæŽæ°ããããšãéžæã§ããŸãã
#nullable enable public void M(string? p) { int length = p.Length; // Warning: p is maybe null string s = p; // No warning. p is not null if (s != null) { int l2 = s.Length; // No warning. s is not null } int l3 = s.Length; // Warning. s is maybe null }åã®äŸã§ã¯ãã¹ããŒãã¡ã³ãã®
int length = p.Length;åŸã«ãpã® null ç¶æ ã null ã§ãªããšã³ã³ãã€ã©ã倿ããå ŽåããããŸãã null ã ã£ãå Žåããã®ã¹ããŒãã¡ã³ãã¯NullReferenceExceptionãã¹ããŒããŸãã ããã¯ãã³ãŒãã®åã«if (p == null) throw NullReferenceException();ããã£ãå Žåã®åäœãšäŒŒãŠããŸãããèšè¿°ãããã³ãŒãã«ãã£ãŠèŠåãçæãããå¯èœæ§ãããç¹ãç°ãªããŸãããã®ç®çã¯ãäŸå€ãæé»çã«ã¹ããŒãããå¯èœæ§ãããããšãèŠåããããšã§ãã çµäºãµã³ãã«
ã¡ãœããã®åŸåã§ã¯ãã³ãŒã㯠s ã null åç
§ã§ã¯ãªãããšã確èªããŸãã
s ã® null ç¶æ
ã¯ãnull ãã§ã㯠ãããã¯ãã¯ããŒãºããåŸã« maybe null ã«å€æŽã§ããŸãã ã³ã³ãã€ã©ã¯ãs ã null ã§ãã£ãå¯èœæ§ãããããšãåæãšããŠã³ãŒããèšè¿°ãããŠãããããnull ã§ããå¯èœæ§ãããããšãæšæž¬ã§ããŸãã äžè¬ã«ãã³ãŒãã« null ãã§ãã¯ãå«ãŸããŠããå Žåãã³ã³ãã€ã©ã¯å€ã null ã§ãã£ãå¯èœæ§ãããããšãæšæž¬ã§ããŸãã
äŸ: 次ã®ååŒã«ã¯ãäœããã®åœ¢åŒã® null ãã§ãã¯ãå«ãŸããŠããŸãã
oã® null ç¶æ ã¯ã次ã®åã¹ããŒãã¡ã³ãã®åŸã« null 以å€ãã null ã«å€æŽãããå¯èœæ§ããããŸãã#nullable enable public void M(string s) { int length = s.Length; // No warning. s is not null _ = s == null; // Null check by testing equality. The null state of s // is maybe null length = s.Length; // Warning, and changes the null state of s // to not null _ = s?.Length; // The ?. is a null check and changes the null state of s // to maybe null if (s.Length > 4) // Warning. Changes null state of s to not null { _ = s?[4]; // ?[] is a null check and changes the null state of s // to maybe null _ = s.Length; // Warning. s is maybe null } }
èªåããããã£ãšãã£ãŒã«ãã«äŒŒãã€ãã³ã宣èšã®äž¡æ¹ã§ãã³ã³ãã€ã©ã«ãã£ãŠçæããããããã³ã° ãã£ãŒã«ãã䜿çšãããŸãã Null ç¶æ åæã§ã¯ãã€ãã³ããŸãã¯ããããã£ãžã®å²ãåœãŠãã³ã³ãã€ã©ã«ãã£ãŠçæããããããã³ã° ãã£ãŒã«ããžã®å²ãåœãŠã§ãããšæšæž¬ãããå ŽåããããŸãã
äŸ: ã³ã³ãã€ã©ã¯ãèªåããããã£ãŸãã¯ãã£ãŒã«ãã«äŒŒãã€ãã³ããèšè¿°ãããšã察å¿ããã³ã³ãã€ã©ã«ãã£ãŠçæããããããã³ã° ãã£ãŒã«ããæžã蟌ããã©ããã倿ã§ããŸãã ããããã£ã® null ç¶æ ã¯ããããã³ã° ãã£ãŒã«ãã®ç¶æ ãšäžèŽããŸãã
class Test { public string P { get; set; } public Test() {} // Warning. "P" not set to a non-null value. static void Main() { var t = new Test(); int len = t.P.Length; // No warning. Null state is not null. } }åã®äŸã§ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã¯
Pã null 以å€ã®å€ã«èšå®ãããã³ã³ãã€ã©ãèŠåãçºè¡ããå¯èœæ§ããããŸãã ããããã£ã®åã null é蚱容åç §åã§ãããããPããããã£ã«ã¢ã¯ã»ã¹ããŠãèŠåã¯ãããŸããã çµäºãµã³ãã«
ã³ã³ãã€ã©ã¯ããããã㣠(§15.7) ãç¶æ ãæã€å€æ°ãšããŠããŸãã¯ç¬ç«ãã get ã¢ã¯ã»ãµãŒããã³ set ã¢ã¯ã»ãµãŒ (§15.7.3) ãšããŠæ±ãããšãã§ããŸãã
äŸ: ã³ã³ãã€ã©ã¯ãããããã£ãžã®æžã蟌ã¿ãããããã£ã®èªã¿åãã® null ç¶æ ã倿Žããããããããã£ãèªã¿åãå Žåã«ãã®ããããã£ã® null ç¶æ ã倿Žããããéžæã§ããŸãã
class Test { private string? _field; public string? DisappearingProperty { get { string tmp = _field; _field = null; return tmp; } set { _field = value; } } static void Main() { var t = new Test(); if (t.DisappearingProperty != null) { int len = t.DisappearingProperty.Length; // No warning. A compiler can // assume property is stateful } } }åè¿°ã®äŸã§ã¯ã
DisappearingPropertyã®ãããã³ã° ãã£ãŒã«ãã¯ãèªã¿åãæã« null ã«èšå®ãããŸãã ãã ããã³ã³ãã€ã©ã§ã¯ãããããã£ãèªã¿åããŠãããã®åŒã® null ç¶æ ã¯å€æŽãããªããšæ³å®ãããå ŽåããããŸãã çµäºãµã³ãã«
ã³ã³ãã€ã©ã¯ã倿°ãããããã£ããŸãã¯ã€ãã³ããéåç
§ããä»»æã®åŒã䜿çšããŠãnull ç¶æ
ã null 以å€ã«èšå®ã§ããŸãã null ã®å Žåãéåç
§åŒã¯ NullReferenceException ãã¹ããŒããŸãã
äŸ:
public class C { private C? child; public void M() { _ = child.child.child; // Warning. Dereference possible null value var greatGrandChild = child.child.child; // No warning. } }çµäºãµã³ãã«
8.9.5.3 å倿
蚺æèŠåãçæããã³ã³ãã€ã©ã¯ãããã®èŠåã«æºæ ããŸãã
æèšïŒ åã®æäžäœã¬ãã«ãŸãã¯å ¥ãåã«ãªã£ã null 蚱容泚éã®éãã¯ãnull é蚱容åç §åãšããã«å¯Ÿå¿ãã null 蚱容å (§8.9.1) ã®éã«ã»ãã³ãã£ãã¯ãªéãããªããããåéã®å€æãèš±å¯ããããã©ããã«ã¯åœ±é¿ããŸããã æ³šé
ã³ã³ãã€ã©ã¯ã倿ãçž®å°ããããšãã«ãæäžäœã¬ãã«ãŸãã¯å ¥ãåã«ãªã£ã 2 ã€ã®åã®éã§ null 蚱容泚éãç°ãªãå Žåã«èŠåãçºè¡ããããšããããŸãã
äŸ: æäžäœã¬ãã«ã®æ³šéãç°ãªãå
#nullable enable public class C { public void M1(string p) { _ = (string?)p; // No warning, widening } public void M2(string? p) { _ = (string)p; // Warning, narrowing _ = (string)p!; // No warning, suppressed } }çµäºãµã³ãã«
äŸ: å ¥ãåã«ãªã£ã null 蚱容泚éãç°ãªãå
#nullable enable public class C { public void M1((string, string) p) { _ = ((string?, string?))p; // No warning, widening } public void M2((string?, string?) p) { _ = ((string, string))p; // Warning, narrowing _ = ((string, string))p!; // No warning, suppressed } }çµäºãµã³ãã«
ã³ã³ãã€ã©ã¯ãå倿ã«å¯ŸããŠèŠåãçºè¡ãããã©ãããæ±ºå®ããéã«ãã€ã³ã¿ãŒãã§ã€ã¹åæ£ (§19.2.3.3)ãããªã²ãŒã忣 (§21.4)ãé åå ±åæ£ (§17.6) ã®èŠåã«åŸãããšãã§ããŸãã
(ããã³M7ã§äœ¿çšããã察å¿ãã null é蚱容é
ååã®ä»æ§ã«ã€ããŠã¯ãM8 ãåç
§ããŠãã ãã)ã
#nullable enable public class C { public void M1(IEnumerable<string> p) { IEnumerable<string?> v1 = p; // No warning } public void M2(IEnumerable<string?> p) { IEnumerable<string> v1 = p; // Warning IEnumerable<string> v2 = p!; // No warning } public void M3(Action<string?> p) { Action<string> v1 = p; // No warning } public void M4(Action<string> p) { Action<string?> v1 = p; // Warning Action<string?> v2 = p!; // No warning } public void M5(string[] p) { string?[] v1 = p; // No warning } public void M6(string?[] p) { string[] v1 = p; // Warning string[] v2 = p!; // No warning } public void M7(string[][,] p) { string[,]?[] v1 = p; // No warning } public void M8(string[]?[,] p) { string[,][] v1 = p; // Warning string[,][] v2 = p!; // No warning } }çµäºãµã³ãã«
ããªã¢ã³ã倿ãèš±å¯ããªãåã§ null å€ã®èš±å®¹ãã©ã¡ãã®æ¹åã«ãç°ãªãå Žåãã³ã³ãã€ã©ã¯èŠåãçºè¡ããããšããããŸãã
#nullable enable public class C { public void M1(List<string> p) { List<string?> v1 = p; // Warning List<string?> v2 = p!; // No warning } public void M2(List<string?> p) { List<string> v1 = p; // Warning List<string> v2 = p!; // No warning } }çµäºãµã³ãã«
ãªããããã倿æŒç®å (§10.6.2) ã®çµæãåç §åã§ãããnull é蚱容åç §åã«å€æãããå Žåãã³ã³ãã€ã©ã¯èŠåãçºè¡ããããšããããŸããããã¯ããªããããã倿æŒç®åã®çµæã null ã§ããå¯èœæ§ãããããã§ãã
#nullable enable class C { void M() { C? a = (int?)null; // No warning C b = (int?)null; // Warning: Possible assignment to null C c = 1; // No warning } public static implicit operator C(int v) => new C(); }çµäºãµã³ãã«
æ¡ä»¶ä»ãã§èŠç¯çãªããã¹ãã®æ«å°Ÿ
ECMA C# draft specification