Wednesday, October 24, 2007

C# 3.0 language specifications available for download

Get it here: http://download.microsoft.com/download/3/8/8/388e7205-bc10-4226-b2a8-75351c669b09/csharp%20language%20specification.doc

The document contains 503 pages.

Table of Contents
1. Introduction 1
1.1 Hello world 1
1.2 Program structure 2
1.3 Types and variables 4
1.4 Expressions 6
1.5 Statements 8
1.6 Classes and objects 12
1.6.1 Members 12
1.6.2 Accessibility 13
1.6.3 Type parameters 13
1.6.4 Base classes 14
1.6.5 Fields 14
1.6.6 Methods 15
1.6.6.1 Parameters 15
1.6.6.2 Method body and local variables 16
1.6.6.3 Static and instance methods 17
1.6.6.4 Virtual, override, and abstract methods 18
1.6.6.5 Method overloading 20
1.6.7 Other function members 21
1.6.7.1 Constructors 22
1.6.7.2 Properties 23
1.6.7.3 Indexers 23
1.6.7.4 Events 24
1.6.7.5 Operators 24
1.6.7.6 Destructors 25
1.7 Structs 25
1.8 Arrays 26
1.9 Interfaces 27
1.10 Enums 29
1.11 Delegates 30
1.12 Attributes 31

2. Lexical structure 33
2.1 Programs 33
2.2 Grammars 33
2.2.1 Grammar notation 33
2.2.2 Lexical grammar 34
2.2.3 Syntactic grammar 34
2.3 Lexical analysis 34
2.3.1 Line terminators 35
2.3.2 Comments 35
2.3.3 White space 37
2.4 Tokens 37
2.4.1 Unicode character escape sequences 37
2.4.2 Identifiers 38
2.4.3 Keywords 40
2.4.4 Literals 40
2.4.4.1 Boolean literals 40
2.4.4.2 Integer literals 40
2.4.4.3 Real literals 42
2.4.4.4 Character literals 42
2.4.4.5 String literals 43
2.4.4.6 The null literal 45
2.4.5 Operators and punctuators 45
2.5 Pre-processing directives 45
2.5.1 Conditional compilation symbols 47
2.5.2 Pre-processing expressions 47
2.5.3 Declaration directives 48
2.5.4 Conditional compilation directives 49
2.5.5 Diagnostic directives 51
2.5.6 Region directives 52
2.5.7 Line directives 52
2.5.8 Pragma directives 53
2.5.8.1 Pragma warning 53

3. Basic concepts 55
3.1 Application Startup 55
3.2 Application termination 56
3.3 Declarations 56
3.4 Members 58
3.4.1 Namespace members 59
3.4.2 Struct members 59
3.4.3 Enumeration members 59
3.4.4 Class members 59
3.4.5 Interface members 60
3.4.6 Array members 60
3.4.7 Delegate members 60
3.5 Member access 60
3.5.1 Declared accessibility 60
3.5.2 Accessibility domains 61
3.5.3 Protected access for instance members 63
3.5.4 Accessibility constraints 64
3.6 Signatures and overloading 65
3.7 Scopes 66
3.7.1 Name hiding 69
3.7.1.1 Hiding through nesting 69
3.7.1.2 Hiding through inheritance 70
3.8 Namespace and type names 71
3.8.1 Fully qualified names 73
3.9 Automatic memory management 74
3.10 Execution order 76

4. Types 79
4.1 Value types 79
4.1.1 The System.ValueType type 80
4.1.2 Default constructors 80
4.1.3 Struct types 81
4.1.4 Simple types 81
4.1.5 Integral types 82
4.1.6 Floating point types 83
4.1.7 The decimal type 84
4.1.8 The bool type 85
4.1.9 Enumeration types 85
4.1.10 Nullable types 85
4.2 Reference types 86
4.2.1 Class types 86
4.2.2 The object type 87
4.2.3 The string type 87
4.2.4 Interface types 87
4.2.5 Array types 87
4.2.6 Delegate types 87
4.3 Boxing and unboxing 88
4.3.1 Boxing conversions 88
4.3.2 Unboxing conversions 89
4.4 Constructed types 90
4.4.1 Type arguments 91
4.4.2 Open and closed types 91
4.4.3 Bound and unbound types 91
4.4.4 Satisfying constraints 91
4.5 Type parameters 92
4.6 Expression tree types 93

5. Variables 95
5.1 Variable categories 95
5.1.1 Static variables 95
5.1.2 Instance variables 95
5.1.2.1 Instance variables in classes 96
5.1.2.2 Instance variables in structs 96
5.1.3 Array elements 96
5.1.4 Value parameters 96
5.1.5 Reference parameters 96
5.1.6 Output parameters 97
5.1.7 Local variables 97
5.2 Default values 98
5.3 Definite assignment 98
5.3.1 Initially assigned variables 99
5.3.2 Initially unassigned variables 99
5.3.3 Precise rules for determining definite assignment 99
5.3.3.1 General rules for statements 100
5.3.3.2 Block statements, checked, and unchecked statements 100
5.3.3.3 Expression statements 100
5.3.3.4 Declaration statements 101
5.3.3.5 If statements 101
5.3.3.6 Switch statements 101
5.3.3.7 While statements 101
5.3.3.8 Do statements 102
5.3.3.9 For statements 102
5.3.3.10 Break, continue, and goto statements 102
5.3.3.11 Throw statements 102
5.3.3.12 Return statements 102
5.3.3.13 Try-catch statements 103
5.3.3.14 Try-finally statements 103
5.3.3.15 Try-catch-finally statements 103
5.3.3.16 Foreach statements 104
5.3.3.17 Using statements 104
5.3.3.18 Lock statements 105
5.3.3.19 Yield statements 105
5.3.3.20 General rules for simple expressions 105
5.3.3.21 General rules for expressions with embedded expressions 105
5.3.3.22 Invocation expressions and object creation expressions 106
5.3.3.23 Simple assignment expressions 106
5.3.3.24 && expressions 106
5.3.3.25 || expressions 107
5.3.3.26 ! expressions 108
5.3.3.27 ?? expressions 108
5.3.3.28 ?: expressions 109
5.3.3.29 Anonymous functions 109
5.4 Variable references 110
5.5 Atomicity of variable references 110

6. Conversions 111
6.1 Implicit conversions 111
6.1.1 Identity conversion 111
6.1.2 Implicit numeric conversions 111
6.1.3 Implicit enumeration conversions 112
6.1.4 Implicit nullable conversions 112
6.1.5 Null literal conversions 112
6.1.6 Implicit reference conversions 113
6.1.7 Boxing conversions 113
6.1.8 Implicit constant expression conversions 114
6.1.9 Implicit conversions involving type parameters 114
6.1.10 User-defined implicit conversions 114
6.1.11 Anonymous function conversions and method group conversions 114
6.2 Explicit conversions 114
6.2.1 Explicit numeric conversions 115
6.2.2 Explicit enumeration conversions 116
6.2.3 Explicit nullable conversions 117
6.2.4 Explicit reference conversions 117
6.2.5 Unboxing conversions 118
6.2.6 Explicit conversions involving type parameters 118
6.2.7 User-defined explicit conversions 119
6.3 Standard conversions 119
6.3.1 Standard implicit conversions 119
6.3.2 Standard explicit conversions 120
6.4 User-defined conversions 120
6.4.1 Permitted user-defined conversions 120
6.4.2 Lifted conversion operators 120
6.4.3 Evaluation of user-defined conversions 120
6.4.4 User-defined implicit conversions 121
6.4.5 User-defined explicit conversions 122
6.5 Anonymous function conversions 123
6.5.1 Evaluation of anonymous function conversions to delegate types 124
6.5.2 Evaluation of anonymous function conversions to expression tree types 125
6.5.3 Implementation example 125
6.6 Method group conversions 127

7. Expressions 131
7.1 Expression classifications 131
7.1.1 Values of expressions 132
7.2 Operators 132
7.2.1 Operator precedence and associativity 132
7.2.2 Operator overloading 133
7.2.3 Unary operator overload resolution 135
7.2.4 Binary operator overload resolution 135
7.2.5 Candidate user-defined operators 135
7.2.6 Numeric promotions 136
7.2.6.1 Unary numeric promotions 136
7.2.6.2 Binary numeric promotions 136
7.2.7 Lifted operators 137
7.3 Member lookup 138
7.3.1 Base types 139
7.4 Function members 139
7.4.1 Argument lists 142
7.4.2 Type inference 144
7.4.2.1 The first phase 145
7.4.2.2 The second phase 145
7.4.2.3 Input types 145
7.4.2.4 Output types 145
7.4.2.5 Dependence 145
7.4.2.6 Output type inferences 145
7.4.2.7 Explicit parameter type inferences 146
7.4.2.8 Exact inferences 146
7.4.2.9 Lower-bound inferences 146
7.4.2.10 Fixing 146
7.4.2.11 Inferred return type 147
7.4.2.12 Type inference for conversion of method groups 148
7.4.2.13 Finding the best common type of a set of expressions 148
7.4.3 Overload resolution 148
7.4.3.1 Applicable function member 149
7.4.3.2 Better function member 149
7.4.3.3 Better conversion from expression 150
7.4.3.4 Better conversion from type 151
7.4.3.5 Overloading in generic classes 151
7.4.4 Function member invocation 152
7.4.4.1 Invocations on boxed instances 153
7.5 Primary expressions 153
7.5.1 Literals 154
7.5.2 Simple names 154
7.5.2.1 Invariant meaning in blocks 156
7.5.3 Parenthesized expressions 156
7.5.4 Member access 157
7.5.4.1 Identical simple names and type names 158
7.5.4.2 Grammar ambiguities 159
7.5.5 Invocation expressions 160
7.5.5.1 Method invocations 160
7.5.5.2 Extension method invocations 161
7.5.5.3 Delegate invocations 163
7.5.6 Element access 164
7.5.6.1 Array access 164
7.5.6.2 Indexer access 165
7.5.7 This access 165
7.5.8 Base access 166
7.5.9 Postfix increment and decrement operators 166
7.5.10 The new operator 167
7.5.10.1 Object creation expressions 168
7.5.10.2 Object initializers 169
7.5.10.3 Collection initializers 171
7.5.10.4 Array creation expressions 172
7.5.10.5 Delegate creation expressions 174
7.5.10.6 Anonymous object creation expressions 175
7.5.11 The typeof operator 177
7.5.12 The checked and unchecked operators 178
7.5.13 Default value expressions 180
7.5.14 Anonymous method expressions 181
7.6 Unary operators 181
7.6.1 Unary plus operator 181
7.6.2 Unary minus operator 181
7.6.3 Logical negation operator 182
7.6.4 Bitwise complement operator 182
7.6.5 Prefix increment and decrement operators 183
7.6.6 Cast expressions 183
7.7 Arithmetic operators 184
7.7.1 Multiplication operator 184
7.7.2 Division operator 185
7.7.3 Remainder operator 186
7.7.4 Addition operator 187
7.7.5 Subtraction operator 189
7.8 Shift operators 191
7.9 Relational and type-testing operators 192
7.9.1 Integer comparison operators 192
7.9.2 Floating-point comparison operators 193
7.9.3 Decimal comparison operators 194
7.9.4 Boolean equality operators 194
7.9.5 Enumeration comparison operators 194
7.9.6 Reference type equality operators 194
7.9.7 String equality operators 196
7.9.8 Delegate equality operators 196
7.9.9 Equality operators and null 197
7.9.10 The is operator 197
7.9.11 The as operator 198
7.10 Logical operators 198
7.10.1 Integer logical operators 199
7.10.2 Enumeration logical operators 199
7.10.3 Boolean logical operators 199
7.10.4 Nullable boolean logical operators 199
7.11 Conditional logical operators 200
7.11.1 Boolean conditional logical operators 201
7.11.2 User-defined conditional logical operators 201
7.12 The null coalescing operator 201
7.13 Conditional operator 202
7.14 Anonymous function expressions 203
7.14.1 Anonymous function signatures 205
7.14.2 Anonymous function bodies 205
7.14.3 Overload resolution 206
7.14.4 Outer variables 206
7.14.4.1 Captured outer variables 206
7.14.4.2 Instantiation of local variables 207
7.14.5 Evaluation of anonymous function expressions 209
7.15 Query expressions 209
7.15.1 Ambiguities in query expressions 211
7.15.2 Query expression translation 211
7.15.2.1 Select and groupby clauses with continuations 211
7.15.2.2 Explicit range variable types 212
7.15.2.3 Degenerate query expressions 212
7.15.2.4 From, let, where, join and orderby clauses 213
7.15.2.5 Select clauses 216
7.15.2.6 Groupby clauses 216
7.15.2.7 Transparent identifiers 217
7.15.3 The query expression pattern 218
7.16 Assignment operators 219
7.16.1 Simple assignment 220
7.16.2 Compound assignment 222
7.16.3 Event assignment 223
7.17 Expression 223
7.18 Constant expressions 223
7.19 Boolean expressions 225

8. Statements 227
8.1 End points and reachability 227
8.2 Blocks 229
8.2.1 Statement lists 229
8.3 The empty statement 230
8.4 Labeled statements 230
8.5 Declaration statements 231
8.5.1 Local variable declarations 231
8.5.2 Local constant declarations 232
8.6 Expression statements 233
8.7 Selection statements 233
8.7.1 The if statement 233
8.7.2 The switch statement 234
8.8 Iteration statements 237
8.8.1 The while statement 238
8.8.2 The do statement 238
8.8.3 The for statement 239
8.8.4 The foreach statement 240
8.9 Jump statements 242
8.9.1 The break statement 243
8.9.2 The continue statement 244
8.9.3 The goto statement 244
8.9.4 The return statement 245
8.9.5 The throw statement 246
8.10 The try statement 247
8.11 The checked and unchecked statements 250
8.12 The lock statement 250
8.13 The using statement 251
8.14 The yield statement 253

9. Namespaces 255
9.1 Compilation units 255
9.2 Namespace declarations 255
9.3 Extern aliases 257
9.4 Using directives 257
9.4.1 Using alias directives 258
9.4.2 Using namespace directives 260
9.5 Namespace members 262
9.6 Type declarations 262
9.7 Namespace alias qualifiers 263
9.7.1 Uniqueness of aliases 264

10. Classes 265
10.1 Class declarations 265
10.1.1 Class modifiers 265
10.1.1.1 Abstract classes 266
10.1.1.2 Sealed classes 266
10.1.1.3 Static classes 266
10.1.2 Partial modifier 267
10.1.3 Type parameters 267
10.1.4 Class base specification 268
10.1.4.1 Base classes 268
10.1.4.2 Interface implementations 269
10.1.5 Type parameter constraints 270
10.1.6 Class body 274
10.2 Partial types 274
10.2.1 Attributes 274
10.2.2 Modifiers 274
10.2.3 Type parameters and constraints 275
10.2.4 Base class 275
10.2.5 Base interfaces 275
10.2.6 Members 276
10.2.7 Partial methods 276
10.2.8 Name binding 279
10.3 Class members 279
10.3.1 The instance type 281
10.3.2 Members of constructed types 281
10.3.3 Inheritance 282
10.3.4 The new modifier 283
10.3.5 Access modifiers 283
10.3.6 Constituent types 283
10.3.7 Static and instance members 283
10.3.8 Nested types 284
10.3.8.1 Fully qualified name 285
10.3.8.2 Declared accessibility 285
10.3.8.3 Hiding 285
10.3.8.4 this access 286
10.3.8.5 Access to private and protected members of the containing type 287
10.3.8.6 Nested types in generic classes 288
10.3.9 Reserved member names 288
10.3.9.1 Member names reserved for properties 289
10.3.9.2 Member names reserved for events 289
10.3.9.3 Member names reserved for indexers 289
10.3.9.4 Member names reserved for destructors 290
10.4 Constants 290
10.5 Fields 291
10.5.1 Static and instance fields 293
10.5.2 Readonly fields 293
10.5.2.1 Using static readonly fields for constants 294
10.5.2.2 Versioning of constants and static readonly fields 294
10.5.3 Volatile fields 295
10.5.4 Field initialization 296
10.5.5 Variable initializers 296
10.5.5.1 Static field initialization 297
10.5.5.2 Instance field initialization 298
10.6 Methods 299
10.6.1 Method parameters 300
10.6.1.1 Value parameters 301
10.6.1.2 Reference parameters 302
10.6.1.3 Output parameters 303
10.6.1.4 Parameter arrays 303
10.6.2 Static and instance methods 306
10.6.3 Virtual methods 306
10.6.4 Override methods 308
10.6.5 Sealed methods 310
10.6.6 Abstract methods 311
10.6.7 External methods 312
10.6.8 Partial methods 313
10.6.9 Extension methods 313
10.6.10 Method body 313
10.6.11 Method overloading 314
10.7 Properties 314
10.7.1 Static and instance properties 315
10.7.2 Accessors 316
10.7.3 Automatically implemented properties 320
10.7.4 Accessibility 321
10.7.5 Virtual, sealed, override, and abstract accessors 322
10.8 Events 324
10.8.1 Field-like events 326
10.8.2 Event accessors 327
10.8.3 Static and instance events 328
10.8.4 Virtual, sealed, override, and abstract accessors 329
10.9 Indexers 329
10.9.1 Indexer overloading 333
10.10 Operators 333
10.10.1 Unary operators 335
10.10.2 Binary operators 335
10.10.3 Conversion operators 336
10.11 Instance constructors 338
10.11.1 Constructor initializers 339
10.11.2 Instance variable initializers 340
10.11.3 Constructor execution 340
10.11.4 Default constructors 342
10.11.5 Private constructors 342
10.11.6 Optional instance constructor parameters 343
10.12 Static constructors 343
10.13 Destructors 345
10.14 Iterators 347
10.14.1 Enumerator interfaces 347
10.14.2 Enumerable interfaces 347
10.14.3 Yield type 347
10.14.4 Enumerator objects 347
10.14.4.1 The MoveNext method 348
10.14.4.2 The Current property 349
10.14.4.3 The Dispose method 349
10.14.5 Enumerable objects 349
10.14.5.1 The GetEnumerator method 350
10.14.6 Implementation example 350

11. Structs 357
11.1 Struct declarations 357
11.1.1 Struct modifiers 357
11.1.2 Partial modifier 358
11.1.3 Struct interfaces 358
11.1.4 Struct body 358
11.2 Struct members 358
11.3 Class and struct differences 358
11.3.1 Value semantics 359
11.3.2 Inheritance 360
11.3.3 Assignment 360
11.3.4 Default values 360
11.3.5 Boxing and unboxing 361
11.3.6 Meaning of this 362
11.3.7 Field initializers 363
11.3.8 Constructors 363
11.3.9 Destructors 364
11.3.10 Static constructors 364
11.4 Struct examples 364
11.4.1 Database integer type 364
11.4.2 Database boolean type 366

12. Arrays 369
12.1 Array types 369
12.1.1 The System.Array type 370
12.1.2 Arrays and the generic IList interface 370
12.2 Array creation 370
12.3 Array element access 371
12.4 Array members 371
12.5 Array covariance 371
12.6 Array initializers 371

13. Interfaces 375
13.1 Interface declarations 375
13.1.1 Interface modifiers 375
13.1.2 Partial modifier 375
13.1.3 Base interfaces 376
13.1.4 Interface body 376
13.2 Interface members 376
13.2.1 Interface methods 378
13.2.2 Interface properties 378
13.2.3 Interface events 378
13.2.4 Interface indexers 378
13.2.5 Interface member access 379
13.3 Fully qualified interface member names 380
13.4 Interface implementations 381
13.4.1 Explicit interface member implementations 382
13.4.2 Uniqueness of implemented interfaces 384
13.4.3 Implementation of generic methods 385
13.4.4 Interface mapping 385
13.4.5 Interface implementation inheritance 388
13.4.6 Interface re-implementation 389
13.4.7 Abstract classes and interfaces 391

14. Enums 393
14.1 Enum declarations 393
14.2 Enum modifiers 393
14.3 Enum members 394
14.4 The System.Enum type 396
14.5 Enum values and operations 396

15. Delegates 397
15.1 Delegate declarations 397
15.2 Delegate compatibility 399
15.3 Delegate instantiation 399
15.4 Delegate invocation 400

16. Exceptions 403
16.1 Causes of exceptions 403
16.2 The System.Exception class 403
16.3 How exceptions are handled 403
16.4 Common Exception Classes 404

17. Attributes 407
17.1 Attribute classes 407
17.1.1 Attribute usage 407
17.1.2 Positional and named parameters 408
17.1.3 Attribute parameter types 409
17.2 Attribute specification 409
17.3 Attribute instances 414
17.3.1 Compilation of an attribute 415
17.3.2 Run-time retrieval of an attribute instance 415
17.4 Reserved attributes 415
17.4.1 The AttributeUsage attribute 415
17.4.2 The Conditional attribute 416
17.4.2.1 Conditional methods 416
17.4.2.2 Conditional attribute classes 418
17.4.3 The Obsolete attribute 419
17.5 Attributes for Interoperation 420
17.5.1 Interoperation with COM and Win32 components 421
17.5.2 Interoperation with other .NET languages 421
17.5.2.1 The IndexerName attribute 421

18. Unsafe code 423
18.1 Unsafe contexts 423
18.2 Pointer types 425
18.3 Fixed and moveable variables 428
18.4 Pointer conversions 428
18.5 Pointers in expressions 429
18.5.1 Pointer indirection 430
18.5.2 Pointer member access 430
18.5.3 Pointer element access 431
18.5.4 The address-of operator 432
18.5.5 Pointer increment and decrement 433
18.5.6 Pointer arithmetic 433
18.5.7 Pointer comparison 434
18.5.8 The sizeof operator 434
18.6 The fixed statement 435
18.7 Fixed size buffers 438
18.7.1 Fixed size buffer declarations 438
18.7.2 Fixed size buffers in expressions 440
18.7.3 Definite assignment checking 440
18.8 Stack allocation 441
18.9 Dynamic memory allocation 442

A. Documentation comments 445
A.1 Introduction 445
A.2 Recommended tags 446
A.2.1 447
A.2.2 447
A.2.3 448
A.2.4 448
A.2.5 449
A.2.6 449
A.2.7 450
A.2.8 451
A.2.9 451
A.2.10 451
A.2.11

452
A.2.12 452
A.2.13 453
A.2.14 453
A.2.15 454
A.2.16 454
A.2.17 454
A.2.18 455
A.3 Processing the documentation file 455
A.3.1 ID string format 455
A.3.2 ID string examples 456
A.4 An example 460
A.4.1 C# source code 460
A.4.2 Resulting XML 462

B. Grammar 468
B.1 Lexical grammar 468
B.1.1 Line terminators 468
B.1.2 Comments 468
B.1.3 White space 469
B.1.4 Tokens 469
B.1.5 Unicode character escape sequences 469
B.1.6 Identifiers 470
B.1.7 Keywords 471
B.1.8 Literals 471
B.1.9 Operators and punctuators 473
B.1.10 Pre-processing directives 473
B.2 Syntactic grammar 476
B.2.1 Basic concepts 476
B.2.2 Types 476
B.2.3 Variables 477
B.2.4 Expressions 478
B.2.5 Statements 484
B.2.6 Namespaces 488
B.2.7 Classes 489
B.2.8 Structs 496
B.2.9 Arrays 496
B.2.10 Interfaces 497
B.2.11 Enums 498
B.2.12 Delegates 498
B.2.13 Attributes 499
B.3 Grammar extensions for unsafe code 500

No comments: