C# 命名空間與類型名

2018-09-28 18:42 更新

命名空間與類型名

C# 程序的上下文要求指定命名空間名標(biāo)記 namespace-name 或類型名標(biāo)記 type-name

namespace-name 標(biāo)記是一個引用命名空間的 namespace-or-type-name 標(biāo)記,它根據(jù)如下描述執(zhí)行解析工作(resolution),namespace-namenamespace-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-namenamespace-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),Nnamespace-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)記是 II<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 或或其任意基類包含具有名稱 IK 個類型形參的嵌套可訪問類型(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í)體:
      • 如果 K 是零,同時 I 是 N 內(nèi)命名空間的名稱,則:
        • 如果 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。
      • 不然的話,如果 N 包含擁有名為 I 且有 K 個類型形參的可訪問類型,則:
        • 如果 K 是零且 namespace-or-type-name 標(biāo)記出現(xiàn)的位置閉包于名為 N 的命名空間聲明內(nèi),同時命名空間聲明包含名為 I 的與某類型或命名空間相關(guān)的 extern-alias-directiveusing-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-directiveusing-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.IN.I<A1, ..., AK>.Nnamespace-or-type-name 首先解析(resolved)為 namespace-or-type-name。如果 N 的解析(resolution)不成功,那么會出現(xiàn)一個「編譯時錯誤」。否則,N.IN.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-nameT.I 形式的 namespace-or-type-name 中的 T,或者
  • namespace-or-type-nametypeof(T) 形式的 typeof-expression(第七章第 5.11 節(jié))中的 T。

完全限定名

每個命名空間和類型都擁有一個完全限定名(fully qualified name),它是一個唯一標(biāo)識(uniquely identifies),用于相互間進(jìn)行區(qū)分。命名空間或類型 N 的完全限定名遵照以下規(guī)則決定:

  • 如果 N 是一個全局命名空間成員,則其完全限定名為 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
}
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號