C# Basic Concepts—Namespace and Type Names

Microsoft .NET Framework, ASP.NET, Visual C# (CSharp, C Sharp, C-Sharp) Developer Training, Visual Studio


Jump to: navigation, search
CSharp-Online.NET:Articles
C# Articles

C# Basic Concepts

© 2006 Pearson Education, Inc.

Namespace and Type Names

Several contexts in a C# program require a namespace-name or a type-name to be specified. Either form of name is written as one or more identifiers separated by "." tokens.

namespace-name: 
     namespace-or-type-name

type-name:
     namespace-or-type-name

namespace-or-type-name:
     identifier
     namespace-or-type-name . identifier

A type-name is a namespace-or-type-name that refers to a type. Following resolution as described shortly, the namespace-or-type-name of a type-name must refer to a type; otherwise, a compile-time error occurs.

The meaning of a namespace-or-type-name is determined as follows.

  • If the namespace-or-type-name consists of a single identifier, then the following happens.
  • If the namespace-or-type-name appears within the body of a class or struct declaration, then starting with that class or struct declaration and continuing with each enclosing class or struct declaration (if any), if a member with the given name exists, is accessible, and denotes a type, then the namespace-or-type-name refers to that member. Note that nontype members (constants, fields, methods, properties, indexers, operators, instance constructors, destructors, and static constructors) are ignored when determining the meaning of a namespace-or-type-name.
  • Otherwise, starting with the namespace in which the namespace-or-type-name occurs, continuing with each enclosing namespace (if any), and ending with the global namespace, the following steps are evaluated until an entity is located.
  • If the namespace contains a namespace member with the given name, then the namespace-or-type-name refers to that member and, depending on the member, is classified as a namespace or a type.
  • Otherwise, if the namespace has a corresponding namespace declaration enclosing the location where the namespace-or-type-name occurs, then the following occurs.
  • If the namespace declaration contains a using-alias-directive that associates the given name with an imported namespace or type, then the namespace-or-type-name refers to that namespace or type.
  • Otherwise, if the namespaces imported by the using-namespace-directives of the namespace declaration contain exactly one type with the given name, then the namespace-or-type-name refers to that type.
  • Otherwise, if the namespaces imported by the using-namespace-directives of the namespace declaration contain more than one type with the given name, then the namespace-or-type-name is ambiguous and an error occurs.
  • Otherwise, the namespace-or-type-name is undefined and a compile-time error occurs.
  • Otherwise, the namespace-or-type-name is of the form N.I, where N is a namespace-or-type-name consisting of all identifiers but the rightmost one, and I is the rightmost identifier. N is first resolved as a namespace-or-type-name. If the resolution of N is not successful, a compile-time error occurs. Otherwise, N.I is resolved as follows.
  • If N is a namespace and I is the name of an accessible member of that namespace, then N.I refers to that member and, depending on the member, is classified as a namespace or a type.
  • If N is a class or struct type and I is the name of an accessible type in N, then N.I refers to that type.
  • Otherwise, N.I is an invalid namespace-or-type-name, and a compile-time error occurs.


Previous_Page_.gif Next_Page_.gif


Personal tools