10.8 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 below, the
namespace-or-type-name of a type-name must refer to a type, or otherwise a
compile-time error occurs.
A namespace-name is a namespace-or-type-name that refers to a namespace.
Following resolution as
described below, the namespace-or-type-name of a namespace-name must refer
to a namespace, or
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:
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. Non-type 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:
C# LANGUAGE SPECIFICATION
84
. If the namespace contains a namespace member with the given name, then
the namespace-ortype-
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:
o 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.
o 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.
o 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-typename
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.