A namespace-declaration consists of the keyword namespace, followed by a
namespace name and body,
optionally followed by a semicolon.
namespace-declaration:
namespace qualified-identifier namespace-body ;opt
qualified-identifier:
identifier
qualified-identifier . identifier
namespace-body:
{ using-directivesopt namespace-member-declarationsopt }
C# LANGUAGE SPECIFICATION
202
A namespace-declaration may occur as a top-level declaration in a
compilation-unit or as a member
declaration within another namespace-declaration. When a
namespace-declaration occurs as a top-level
declaration in a compilation-unit, the namespace becomes a member of the
global namespace. When a
namespace-declaration occurs within another namespace-declaration, the
inner namespace becomes a
member of the outer namespace. In either case, the name of a namespace must
be unique within the
containing namespace.
Namespaces are implicitly public and the declaration of a namespace cannot
include any access modifiers.
Within a namespace-body, the optional using-directives import the names of
other namespaces and types,
allowing them to be referenced directly instead of through qualified names.
The optional namespacemember-
declarations contribute members to the declaration space of the namespace.
Note that all usingdirectives
must appear before any member declarations.
The qualified-identifier of a namespace-declaration may be a single
identifier or a sequence of identifiers
separated by ?.? tokens. The latter form permits a program to define a
nested namespace without lexically
nesting several namespace declarations. [Example: For example,
namespace N1.N2
{
class A {}
class B {}
}
is semantically equivalent to
namespace N1
{
namespace N2
{
class A {}
class B {}
}
}
end example]
Namespaces are open-ended, and two namespace declarations with the same
fully qualified name contribute
to the same declaration space (§10.3). [Example: In the example
namespace N1.N2
{
class A {}
}
namespace N1.N2
{
class B {}
}
the two namespace declarations above contribute to the same declaration
space, in this case declaring two
classes with the fully qualified names N1.N2.A and N1.N2.B. Because the two
declarations contribute to
the same declaration space, it would have been an error if each contained a
declaration of a member with the
same name. end example]
Namespaces whose names begin with System. are reserved for use by the
Standard Library (§D).