Copyright Microsoft Corporation 1999-2007. All Rights Reserved. Please send corrections, comments, and other feedback to sharp@microsoft.com C # Language Specification Version 3.03.0 Copyright Microsoft Corporation 1999-2007. All Rights Reserved. Notice © 1999-2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Visual Basic, Visual C#, and Visual C++ are either registered trademarks or trademarks of Microsoft Corporation in the U.S.A. and/or other countries/regions. Other product and company names mentioned herein may be the trademarks of their respective owners. Copyright Microsoft Corporation 1999-2007. All Rights Reserved. Please send corrections, comments, and other feedback to sharp@microsoft.com Table of Contents 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 Copyright Microsoft Corporation 1999-2007. All Rights Reserved. v C# Language Specification 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 58 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 77 4.1 Value types 77 4.1.1 The System.ValueType type 78 4.1.2 Default constructors 78 4.1.3 Struct types 79 4.1.4 Simple types 79 4.1.5 Integral types 80 4.1.6 Floating point types 81 vi Copyright Microsoft Corporation 1999-2007. All Rights Reserved. Table of Contents 4.1.7 The decimal type 82 4.1.8 The bool type 83 4.1.9 Enumeration types 83 4.1.10 Nullable types 83 4.2 Reference types 84 4.2.1 Class types 84 4.2.2 The object type 85 4.2.3 The string type 85 4.2.4 Interface types 85 4.2.5 Array types 85 4.2.6 Delegate types 85 4.3 Boxing and unboxing 86 4.3.1 Boxing conversions 86 4.3.2 Unboxing conversions 87 4.4 Constructed types 88 4.4.1 Type arguments 89 4.4.2 Open and closed types 89 4.4.3 Bound and unbound types 89 4.4.4 Satisfying constraints 89 4.5 Type parameters 90 4.6 Expression tree types 91 5. Variables 93 5.1 Variable categories 93 5.1.1 Static variables 93 5.1.2 Instance variables 93 5.1.2.1 Instance variables in classes 94 5.1.2.2 Instance variables in structs 94 5.1.3 Array elements 94 5.1.4 Value parameters 94 5.1.5 Reference parameters 94 5.1.6 Output parameters 95 5.1.7 Local variables 95 5.2 Default values 96 5.3 Definite assignment 96 5.3.1 Initially assigned variables 97 5.3.2 Initially unassigned variables 97 5.3.3 Precise rules for determining definite assignment 97 5.3.3.1 General rules for statements 98 5.3.3.2 Block statements, checked, and unchecked statements 98 5.3.3.3 Expression statements 98 5.3.3.4 Declaration statements 99 5.3.3.5 If statements 99 5.3.3.6 Switch statements 99 5.3.3.7 While statements 99 5.3.3.8 Do statements 100 5.3.3.9 For statements 100 5.3.3.10 Break, continue, and goto statements 100 5.3.3.11 Throw statements 100 5.3.3.12 Return statements 100 5.3.3.13 Try-catch statements 101 Copyright Microsoft Corporation 1999-2007. All Rights Reserved. vii C# Language Specification 5.3.3.14 Try-finally statements 101 5.3.3.15 Try-catch-finally statements 101 5.3.3.16 Foreach statements 102 5.3.3.17 Using statements 102 5.3.3.18 Lock statements 103 5.3.3.19 Yield statements 103 5.3.3.20 General rules for simple expressions 103 5.3.3.21 General rules for expressions with embedded expressions 103 5.3.3.22 Invocation expressions and object creation expressions 104 5.3.3.23 Simple assignment expressions 104 5.3.3.24 && expressions 104 5.3.3.25 || expressions 105 5.3.3.26 ! expressions 106 5.3.3.27 ?? expressions 106 5.3.3.28 ?: expressions 107 5.3.3.29 Anonymous functions 107 5.4 Variable references 108 5.5 Atomicity of variable references 108 6. Conversions 109 6.1 Implicit conversions 109 6.1.1 Identity conversion 109 6.1.2 Implicit numeric conversions 109 6.1.3 Implicit enumeration conversions 110 6.1.4 Implicit nullable conversions 110 6.1.5 Null literal conversions 110 6.1.6 Implicit reference conversions 111 6.1.7 Boxing conversions 111 6.1.8 Implicit constant expression conversions 112 6.1.9 Implicit conversions involving type parameters 112 6.1.10 User-defined implicit conversions 112 6.1.11 Anonymous function conversions and method group conversions 112 6.2 Explicit conversions 112 6.2.1 Explicit numeric conversions 113 6.2.2 Explicit enumeration conversions 114 6.2.3 Explicit nullable conversions 115 6.2.4 Explicit reference conversions 115 6.2.5 Unboxing conversions 116 6.2.6 Explicit conversions involving type parameters 116 6.2.7 User-defined explicit conversions 117 6.3 Standard conversions 117 6.3.1 Standard implicit conversions 117 6.3.2 Standard explicit conversions 118 6.4 User-defined conversions 118 6.4.1 Permitted user-defined conversions 118 6.4.2 Lifted conversion operators 118 6.4.3 Evaluation of user-defined conversions 118 6.4.4 User-defined implicit conversions 119 6.4.5 User-defined explicit conversions 120 6.5 Anonymous function conversions 121 6.5.1 Evaluation of anonymous function conversions to delegate types 122 viii Copyright Microsoft Corporation 1999-2007. All Rights Reserved. Table of Contents 6.5.2 Evaluation of anonymous function conversions to expression tree types 123 6.5.3 Implementation example 123 6.6 Method group conversions 125 7. Expressions 129 7.1 Expression classifications 129 7.1.1 Values of expressions 130 7.2 Operators 130 7.2.1 Operator precedence and associativity 130 7.2.2 Operator overloading 131 7.2.3 Unary operator overload resolution 133 7.2.4 Binary operator overload resolution 133 7.2.5 Candidate user-defined operators 133 7.2.6 Numeric promotions 134 7.2.6.1 Unary numeric promotions 134 7.2.6.2 Binary numeric promotions 134 7.2.7 Lifted operators 135 7.3 Member lookup 136 7.3.1 Base types 137 7.4 Function members 137 7.4.1 Argument lists 140 7.4.2 Type inference 142 7.4.2.1 The first phase 143 7.4.2.2 The second phase 143 7.4.2.3 Input types 143 7.4.2.4 Output types 143 7.4.2.5 Dependence 143 7.4.2.6 Output type inferences 143 7.4.2.7 Explicit parameter type inferences 144 7.4.2.8 Exact inferences 144 7.4.2.9 Lower-bound inferences 144 7.4.2.10 Fixing 144 7.4.2.11 Inferred return type 145 7.4.2.12 Type inference for conversion of method groups 146 7.4.2.13 Finding the best common type of a set of expressions 146 7.4.3 Overload resolution 146 7.4.3.1 Applicable function member 147 7.4.3.2 Better function member 147 7.4.3.3 Better conversion from expression 148 7.4.3.4 Better conversion from type 149 7.4.3.5 Overloading in generic classes 149 7.4.4 Function member invocation 150 7.4.4.1 Invocations on boxed instances 151 7.5 Primary expressions 151 7.5.1 Literals 152 7.5.2 Simple names 152 7.5.2.1 Invariant meaning in blocks 154 7.5.3 Parenthesized expressions 154 7.5.4 Member access 155 7.5.4.1 Identical simple names and type names 156 7.5.4.2 Grammar ambiguities 157 Copyright Microsoft Corporation 1999-2007. All Rights Reserved. ix C# Language Specification 7.5.5 Invocation expressions 158 7.5.5.1 Method invocations 158 7.5.5.2 Extension method invocations 159 7.5.5.3 Delegate invocations 161 7.5.6 Element access 162 7.5.6.1 Array access 162 7.5.6.2 Indexer access 163 7.5.7 This access 163 7.5.8 Base access 164 7.5.9 Postfix increment and decrement operators 164 7.5.10 The new operator 165 7.5.10.1 Object creation expressions 166 7.5.10.2 Object initializers 167 7.5.10.3 Collection initializers 169 7.5.10.4 Array creation expressions 170 7.5.10.5 Delegate creation expressions 172 7.5.10.6 Anonymous object creation expressions 173 7.5.11 The typeof operator 175 7.5.12 The checked and unchecked operators 176 7.5.13 Default value expressions 178 7.5.14 Anonymous method expressions 179 7.6 Unary operators 179 7.6.1 Unary plus operator 179 7.6.2 Unary minus operator 179 7.6.3 Logical negation operator 180 7.6.4 Bitwise complement operator 180 7.6.5 Prefix increment and decrement operators 181 7.6.6 Cast expressions 181 7.7 Arithmetic operators 182 7.7.1 Multiplication operator 182 7.7.2 Division operator 183 7.7.3 Remainder operator 184 7.7.4 Addition operator 185 7.7.5 Subtraction operator 187 7.8 Shift operators 189 7.9 Relational and type-testing operators 190 7.9.1 Integer comparison operators 191 7.9.2 Floating-point comparison operators 191 7.9.3 Decimal comparison operators 192 7.9.4 Boolean equality operators 192 7.9.5 Enumeration comparison operators 192 7.9.6 Reference type equality operators 193 7.9.7 String equality operators 194 7.9.8 Delegate equality operators 195 7.9.9 Equality operators and null 195 7.9.10 The is operator 195 7.9.11 The as operator 196 7.10 Logical operators 197 7.10.1 Integer logical operators 197 7.10.2 Enumeration logical operators 197 7.10.3 Boolean logical operators 198 x Copyright Microsoft Corporation 1999-2007. All Rights Reserved. Table of Contents 7.10.4 Nullable boolean logical operators 198 7.11 Conditional logical operators 198 7.11.1 Boolean conditional logical operators 199 7.11.2 User-defined conditional logical operators 199 7.12 The null coalescing operator 200 7.13 Conditional operator 200 7.14 Anonymous function expressions 201 7.14.1 Anonymous function signatures 203 7.14.2 Anonymous function bodies 203 7.14.3 Overload resolution 204 7.14.4 Outer variables 205 7.14.4.1 Captured outer variables 205 7.14.4.2 Instantiation of local variables 206 7.14.5 Evaluation of anonymous function expressions 208 7.15 Query expressions 208 7.15.1 Ambiguities in query expressions 209 7.15.2 Query expression translation 209 7.15.2.1 Select and groupby clauses with continuations 210 7.15.2.2 Explicit range variable types 210 7.15.2.3 Degenerate query expressions 211 7.15.2.4 From, let, where, join and orderby clauses 211 7.15.2.5 Select clauses 215 7.15.2.6 Groupby clauses 215 7.15.2.7 Transparent identifiers 215 7.15.3 The query expression pattern 217 7.16 Assignment operators 218 7.16.1 Simple assignment 219 7.16.2 Compound assignment 220 7.16.3 Event assignment 221 7.17 Expression 222 7.18 Constant expressions 222 7.19 Boolean expressions 223 8. Statements 225 8.1 End points and reachability 225 8.2 Blocks 227 8.2.1 Statement lists 227 8.3 The empty statement 228 8.4 Labeled statements 228 8.5 Declaration statements 229 8.5.1 Local variable declarations 229 8.5.2 Local constant declarations 230 8.6 Expression statements 231 8.7 Selection statements 231 8.7.1 The if statement 231 8.7.2 The switch statement 232 8.8 Iteration statements 235 8.8.1 The while statement 236 8.8.2 The do statement 236 8.8.3 The for statement 237 8.8.4 The foreach statement 238 Copyright Microsoft Corporation 1999-2007. All Rights Reserved. xi [...]... declarative information about the component; and they incorporate their own documentation C# provides language constructs to directly support these concepts, making C# a very natural language in which to create and use software components Several C# features aid in the construction of robust and durable applications: Garbage collection automatically reclaims memory occupied by unused objects; exception... } catch (Exception e) { Console.WriteLine(e.Message); } finally { Console.WriteLine(“Good bye!”); } } checked and unchecked statements static void Main() { int i = int.MaxValue; checked { Console.WriteLine(i + 1); } unchecked { Console.WriteLine(i + 1); } } Copyright © Microsoft Corporation 1999-2007 All Rights Reserved // Exception // Overflow 11 C# Language Specification lock statement class Account... instance methods A method declared with a static modifier is a static method A static method does not operate on a specific instance and can only directly access static members A method declared without a static modifier is an instance method An instance method operates on a specific instance and can access both static and instance members The instance on which an instance method was invoked can be... but there is only one copy of the Black, White, Red, Green, and Blue static fields: public class Color { public static readonly public static readonly public static readonly public static readonly public static readonly Color Color Color Color Color Black = new Color(0, 0, 0); White = new Color(255, 255, 255); Red = new Color(255, 0, 0); Green = new Color(0, 255, 0); Blue = new Color(0, 0, 255); private... generated by the class Operators Conversions and expression operators supported by the class Constructors Actions required to initialize instances of the class or the class itself Destructors Actions to perform before instances of the class are permanently discarded Types Nested types declared by the class 1.6.2 Accessibility Each member of a class has an associated accessibility, which controls the regions... able to access the member There are five possible forms of accessibility These are summarized in the following table Accessibility Meaning public Access not limited protected Access limited to this class or classes derived from this class internal Access limited to this program protected internal Access limited to this program or classes derived from this class private Access limited to this class 1.6.3... a value type is converted to type object, an object instance, also called a “box,” is allocated to hold the value, and the value is copied into that box Conversely, when an object reference is cast to a value type, a check is made that the referenced object is a box of the correct value type, and, if the check succeeds, the value in the box is copied out C# ’s unified type system effectively means that... class is a data structure that combines state (fields) and actions (methods and other function members) in a single unit A class provides a definition for dynamically created instances of the class, also known as objects Classes support inheritance and polymorphism, mechanisms whereby derived classes can extend and specialize base classes New classes are created using class declarations A class declaration... Reserved 1 C# Language Specification csc hello.cs which produces an executable assembly named hello.exe The output produced by this application when it is run is Hello, World The “Hello, World” program starts with a using directive that references the System namespace Namespaces provide a hierarchical means of organizing C# programs and libraries Namespaces contain types and other namespaces—for example,... Reserved Chapter 18 Unsafe code Jump statements are used to transfer control In this group are the break, continue, goto, throw, return, and yield statements The try catch statement is used to catch exceptions that occur during execution of a block, and the try finally statement is used to specify finalization code that is always executed, whether an exception occurred or not The checked and unchecked . Copyright Microsoft Corporation 1999-2007. All Rights Reserved. Please send corrections, comments, and other feedback to sharp@microsoft.com C # Language Specification Version 3.03.0 Copyright. Microsoft C# compiler using the command line Copyright Microsoft Corporation 1999-2007. All Rights Reserved. 1 C# Language Specification csc hello.cs which produces an executable assembly named hello.exe provide declarative information about the component; and they incorporate their own documentation. C# provides language constructs to directly support these concepts, making C# a very natural language