C# 程序的上下文要求指定命名空間名標(biāo)記 namespace-name
或類型名標(biāo)記 type-name
。
namespace-name
標(biāo)記是一個引用命名空間的 namespace-or-type-name
標(biāo)記,它根據(jù)如下描述執(zhí)行解析工作(resolution),namespace-name
的 namespace-or-type-name
標(biāo)記必須引用一個命名空間,不然將會出現(xiàn)「編譯時錯誤」。沒有類型實(shí)參(type arguments,第四章第 4.1 節(jié))可以在 namespace-name
中出現(xiàn)(只有類型才能具有類型實(shí)參)。
type-name
標(biāo)記是一個引用類型的 namespace-or-type-name
標(biāo)記,它根據(jù)如下描述執(zhí)行解析工作,type-name
的 namespace-or-type-name
標(biāo)記必須引用一個類型,不然會出現(xiàn)「編譯時錯誤」。
如果 namespace-or-type-name
標(biāo)記是 qualified-alias-member
標(biāo)記,則其含義如第九章第七節(jié)所述。否則 namespace-or-type-name
標(biāo)記有以下四種形式:
I
I<A1, ..., AK>
N.I
N.I<A1, ..., AK>
其中 I
是單一修飾符(single identifier),N
是 namespace-or-type-name
,<A1, ..., AK>
是可選的 type-argument-list
。當(dāng)沒有 type-argument-list
被指定時,K
將為零(zero)。
namespace-or-type-name
的含義取決于如下:
如果 namespace-or-type-name
標(biāo)記是 I
或 I<A1, ..., AK>
的形式的話:
K
是零(zero), namespace-or-type-name
標(biāo)記出現(xiàn)在一個泛型方法聲明(generic method declaration,第十章第六節(jié))內(nèi)且其聲明還包含名為 I
的類型形參(type parameter,第十章第 1.3 節(jié)),那么 namespace-or-type-name
引用該類型形參;不然的話,如果 namespace-or-type-name
標(biāo)記出現(xiàn)在類型聲明內(nèi),那么類型 T
的每個實(shí)例(第十章第 3.1 節(jié)),從該類型聲明的實(shí)例類型開始,每個閉包類(enclosing class)或結(jié)構(gòu)聲明(如果有的話)的實(shí)例類型繼續(xù)如下過程:
K
是零,T
的聲明包含名為 I
的類型形參,那么 namespace-or-type-name
標(biāo)記引用該類型形參;namespace-or-type-name
出現(xiàn)在類型聲明主體(body)內(nèi)部,同時 T
或或其任意基類包含具有名稱 I
的 K
個類型形參的嵌套可訪問類型(nested accessible type),那么 namespace-or-type-name
標(biāo)記引用該給定類型實(shí)參(type arguments)構(gòu)造的類型。如果存在多個該類型,則選擇類型聲明于較大程序派生類型內(nèi)的那個類型。要注意,當(dāng)確定了 namespace-or-type-name
標(biāo)記的含義之后,非類型成員(non-type members,包括常量、字段、方法、屬性、索引器、操作符、實(shí)例構(gòu)造函數(shù)、析構(gòu)函數(shù)以及靜態(tài)構(gòu)造函數(shù))以及帶有不同數(shù)量類型形參的類型成員都將被忽略。N
,起始于出現(xiàn) namespace-or-type-name
標(biāo)記的命名空間,持續(xù)到每一個閉包命名空間(如果有的話),直至止于全局命名空間(global namespace),對以下步驟進(jìn)行運(yùn)算直至定位到(located)一個實(shí)體:namespace-or-type-name
出現(xiàn)的位置閉包于名為 N
的命名空間定義內(nèi),同時該命名空間定義包含了一個名為 I
的與某命名空間或類型相關(guān)的 extern-alias-directive
標(biāo)記或 using-alias-directive
標(biāo)記,那么 namespace-or-type-name
標(biāo)記將模棱兩可并會出現(xiàn)一個「編譯時錯誤」。namespace-or-type-name
引用 N
內(nèi)的命名空間 I
。K
是零且 namespace-or-type-name
標(biāo)記出現(xiàn)的位置閉包于名為 N
的命名空間聲明內(nèi),同時命名空間聲明包含名為 I
的與某類型或命名空間相關(guān)的 extern-alias-directive
或 using-alias-directive
標(biāo)記,那么 namespace-or-type-name
標(biāo)記將模棱兩可并會出現(xiàn)一個「編譯時錯誤」。namespace-or-type-name
標(biāo)記引用由給定類型實(shí)參構(gòu)建的類型。namespace-or-type-name
標(biāo)記出現(xiàn)的位置閉包于名為 N
的命名空間聲明內(nèi)的話,則:K
是零并且命名空間包含了名為 I
的與某個導(dǎo)入的命名空間或類型相關(guān)的 extern-alias-directive
或 using-alias-directive
標(biāo)記,那么 namespace-or-type-name
將引用該命名空間或類型。using-namespace-directives
標(biāo)記導(dǎo)入命名空間聲明的命名空間確切包含一個名為 I
的有 K
個類型形參,那么 namespace-or-type-name
將引用由該給定類型實(shí)參構(gòu)造的類型。using-namespace-directives
標(biāo)記導(dǎo)入命名空間聲明的命名空間包含超過一個名為 I
的有 K
個類型形參的類型,那么 namespace-or-type-name
標(biāo)記將模棱兩可并會出現(xiàn)一個「編譯時錯誤」。namespace-or-type-name
標(biāo)記未被定義,同時報出一個「編譯時錯誤」。N.I
或 N.I<A1, ..., AK>.N
的 namespace-or-type-name
首先解析(resolved)為 namespace-or-type-name
。如果 N 的解析(resolution)不成功,那么會出現(xiàn)一個「編譯時錯誤」。否則,N.I
或 N.I<A1, ..., AK>
將按如下進(jìn)行解析:K
是零,并且 N
引用一個命名空間,同時 N
包含一個名為 I
的嵌套命名空間,那么 namespace-or-type-name
標(biāo)記將引用該嵌套命名空間。N
引用一個命名空間,同時 N
包含一個擁有名為 I
且有 K
個類型形參的可訪問類型,那么 namespace-or-type-name
將引用該由指定類型實(shí)參構(gòu)造的類型。N
引用一個(可能是構(gòu)造的)類或結(jié)構(gòu)類型,并且 N
或其任何一個基類包含一個嵌套的名為 I
且有 K
個類型形參的可訪問類,那么 namespace-or-type-name
將引用該由給定類型實(shí)參構(gòu)造的類型。如果存在多個該類型,則選擇類型聲明于較大程序派生類型內(nèi)的那個類型。需要注意的是,如果 N.I
的含義確定為 解析 N
基類的指定一部分,那么 N
的直接基類將被視為對象(object,第十章第 1.4.1 節(jié))。N.I
是個非法的 namespace-or-type-name
標(biāo)記,并會出現(xiàn)一個「編譯時錯誤」。只有在以下情況下才允許 namespace-or-type-name
引用一個靜態(tài)類(第十章第 1.1.3 節(jié))
namespace-or-type-name
是 T.I
形式的 namespace-or-type-name
中的 T,或者namespace-or-type-name
是 typeof(T)
形式的 typeof-expression
(第七章第 5.11 節(jié))中的 T。每個命名空間和類型都擁有一個完全限定名(fully qualified name),它是一個唯一標(biāo)識(uniquely identifies),用于相互間進(jìn)行區(qū)分。命名空間或類型 N 的完全限定名遵照以下規(guī)則決定:
N
;S.N
(S 為 N 所聲明的命名空間或類型之完全限定名)。換句話說,N
的完全限定名是指向(lead to)N 的標(biāo)識符(identifiers)的完整分層路徑(complete hierarchical path)。因?yàn)槊總€命名空間或類型的成員都必須有一個唯一的名稱,因此如果把它們放在命名空間或類型的完全限定名之后,這樣所形成的名稱也總是唯一的。
在下例中演示了多個命名空間和類型的聲明以及與其相關(guān)的完全限定名。
class A {} // A
namespace X // X
{
class B // X.B
{
class C {} // X.B.C
}
namespace Y // X.Y
{
class D {} // X.Y.D
}
}
namespace X.Y // X.Y
{
class E {} // X.Y.E
}
更多建議: