| ECMA-334 C# Language Specification 14.5.4: Member access | 
A  member-access consists of a  primary-expression or a  predefined-type, followed by a "." token, followed by an identifier. 
- member-access
-  primary-expression-  .-  identifier
-  predefined-type-  .-  identifier
- predefined-type
- bool byte char decimal double float int long 
- object sbyte short string uint ulong ushort 
A  member-access of the form E.I, where E is a  primary-expression or a  predefined-type and I is an identifier, is evaluated and classified as follows: 
-  If E is a namespace and I is the name of an accessible member of that namespace, then the result is that member and, depending on the member, is classified as a namespace or a type. 
-  If E is a  predefined-typeor a primary-expressionclassified as a type, and a member lookup (14.3) of I in E produces a match, then E.I is evaluated and classified as follows:
-  If I identifies a type, then the result is that type.  If I identifies one or more methods, then the result is a method group with no associated instance expression.  If I identifies a static property, then the result is a property access with no associated instance expression.  If I identifies a static field: -  If the field is readonly and the reference occurs outside the static constructor of the class or struct in which the field is declared, then the result is a value, namely the value of the static field I in E. 
-  Otherwise, the result is a variable, namely the static field I in E. 
 If I identifies a static event:-  If the reference occurs within the class or struct in which the event is declared, and the event was declared without  event-accessor-declarations(17.7), then E.I is processed exactly as if I was a static field.
-  Otherwise, the result is an event access with no associated instance expression. 
 If I identifies a constant, then the result is a value, namely the value of that constant.  If I identifies an enumeration member, then the result is a value, namely the value of that enumeration member.  Otherwise, E.I is an invalid member reference, and a compile-time error occurs.
-  If E is a property access, indexer access, variable, or value, the type of which is T, and a member lookup (14.3) of I in T produces a match, then E.I is evaluated and classified as follows: 
-  First, if E is a property or indexer access, then the value of the property or indexer access is obtained (14.1.1) and E is reclassified as a value.  If I identifies one or more methods, then the result is a method group with an associated instance expression of E.  If I identifies an instance property, then the result is a property access with an associated instance expression of E.  If T is a  class-typeand I identifies an instance field of that class-type:-  If the value of E is null, then a System.NullReferenceException is thrown. 
-  Otherwise, if the field is readonly and the reference occurs outside an instance constructor of the class in which the field is declared, then the result is a value, namely the value of the field I in the object referenced by E. 
-  Otherwise, the result is a variable, namely the field I in the object referenced by E. 
 If T is a struct-typeand I identifies an instance field of that struct-type:-  If E is a value, or if the field is readonly and the reference occurs outside an instance constructor of the struct in which the field is declared, then the result is a value, namely the value of the field I in the struct instance given by E. 
-  Otherwise, the result is a variable, namely the field I in the struct instance given by E. 
 If I identifies an instance event:-  If the reference occurs within the class or struct in which the event is declared, and the event was declared without  event-accessor-declarations(17.7), then E.I is processed exactly as if I was an instance field.
-  Otherwise, the result is an event access with an associated instance expression of E. 
 
-  Otherwise, E.I is an invalid member reference, and a compile-time error occurs. 
In This Section: