2012-09-22 88 views
1

我已經創建了下面的類:爲什麼我不得不使用完整的命名空間?

using System.Windows; 
using System.Windows.Input; 
using MyUtils.MyArgParser; 

namespace MyUtils.MyImplement 
{ 
    public static class ImplementExitOnEscape 
    { 
     #region ImplementExitOnEscape 

     public static void Implement(Window window) 
     { 
      window.KeyDown += Window_KeyDown; 
     } 

     private static void Window_KeyDown(object sender, KeyEventArgs e) 
     { 
      var window = sender as Window; 
      // Close window when pressing the escape key. 
      if (e.Key == Key.Escape) if (window != null) window.Close(); 

      var optionX = MyArgParser.MyArgParser.GetOptionValue("optionX"); 
     } 

     #endregion //ImplementExitOnEscape 
    } 
} 

爲什麼我被迫在var optionX = MyArgParser.MyArgParser.GetOptionValue("optionX");,而不是僅僅MyArgParser.GetOptionValue("optionX");使用完整的命名空間爲MyArgParser類?

using MyUtils.MyArgParser;被忽略。不管它有沒有不會有什麼區別,編譯器仍然強迫我使用完整的命名空間。

我覺得這很奇怪,因爲它並沒有到處發生。例如,我不需要在定義應用程序入口點的文件中使用完整的名稱空間。

+2

因爲您自己命名它與命名空間 – Patrick

+0

@Patrick I相同,但爲什麼它不會強制我在程序的其他部分使用完整的命名空間,就像在主程序文件中一樣? – IneedHelp

回答

7
var optionX = MyArgParser.MyArgParser.GetOptionValue("optionX"); 

您的類被命名爲您的名稱空間,因此要區分它們,您需要明確地完全引用它。

爲了解決這個問題,要麼改變你的MyArgParser命名空間(例如)MyArgParserNS,你可以用它直接

using MyUtils.MyArgParserNS 

然後:

var optionX = MyArgParser.GetOptionValue("optionX"); 

或者不好,完全引用它。

+0

我明白了,但爲什麼它不會強迫我在程序的其他部分使用完整的命名空間,就像在主程序文件中一樣? – IneedHelp

+0

由於包含那些其他「部分」的父命名空間。鑑於這是不同的,沒有辦法混淆它們(命名空間與類),然後它可以讓你直接調用它。 –

6

問題是你有一個和它的名字空間同名的類,這意味着編譯器不能區分MyArgParser.GetOptionValue中的MyArgParser是一個名字空間還是一個類。

由於每個文件頂部的不同使用語句或其名稱與類名稱衝突的字段或變量,它可能會強制您使用完整的名稱空間。有關詳細信息,請參閱Eric Lippert's Blog post(以及部分2,34)。

有關更多討論,請參閱How to avoid having the same name for a class and it's namespace, such as Technology.Technology?

+0

好的,但爲什麼它不強迫我在程序的其他部分使用完整的命名空間,就像在主程序文件中一樣? – IneedHelp

+0

@IneedHelp沒有看到代碼,很難確定,但我已經添加了一些答案的原因。 – akton

+0

正如Randolf R-F所說,我現在意識到,當在應用程序的命名空間中操作時,我不必使用完整的命名空間,因爲它不共享「MyUtils」命名空間。非常感謝您提供的所有信息。 +1 – IneedHelp

0

可能有幾個原因:

  1. 衝突與另一名

  2. 你的類可以是在另一個名稱。

使用Ctrl + J + K,並搜索您的班級。看VS是否找到它。如果不是,那麼可能是因爲引用問題。你需要添加一個對該庫的引用嗎?

1

你有你的using指令以外的namespace聲明。編譯器搜索一個類型命名空間在這些位置,在該順序:

  1. MyUtils.MyImplement.ImplementExitOnEscape(嵌套類型的當前類型的內部)
  2. MyUtils.MyImplement(類型或在目前的命名空間的命名空間)
  3. MyUtils(「下一個」外層中的類型或名稱空間)
  4. null命名空間或全局命名空間(類型或命名空間)
  5. System.WindowsSystem.Windows.InputMyUtils.MyArgParser你有using S代表(類型或命名空間)

您輸入MyArgParser. <東西>。

(3.)發現匹配,那就是命名空間。只有在(5.)你的using重要。所以MyArgParser引用的是命名空間,而不是類型。

如果您已將using置於namespace區塊內,則情況會有所不同,請參閱an answer of mine in another thread

相關問題