为什么我被迫使用完整的命名空间?

时间:2012-09-22 14:42:10

标签: c# class namespaces

我创建了以下类:

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
    }
}

为什么我被强制使用MyArgParser中的var optionX = MyArgParser.MyArgParser.GetOptionValue("optionX");课程的全名空间,而不仅仅是MyArgParser.GetOptionValue("optionX");

using MyUtils.MyArgParser;被忽略了。不管它是否存在都没有任何区别,编译器仍然强迫我使用完整的命名空间。

我发现这很奇怪,因为它并没有发生在任何地方。例如,我不需要在定义应用程序入口点的文件中使用完整命名空间。

4 个答案:

答案 0 :(得分:7)

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

您的类被命名为您的命名空间,因此要区分它们,您需要明确地完全引用它。

要解决此问题,请将MyArgParser名称空间更改为(例如)MyArgParserNS,然后直接使用

using MyUtils.MyArgParserNS

然后:

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

或者,完全引用它。

答案 1 :(得分:6)

问题是你有一个与其命名空间同名的类,这意味着编译器无法将MyArgParser.GetOptionValue中的MyArgParser区分为命名空间或类。

由于每个文件顶部的不同using语句或名称与类名冲突的字段或变量,它可能会也可能不会强制您使用完整的命名空间。有关详细信息,请参阅主题中的Eric Lippert's Blog post(以及部分234)。

有关此问题的详细讨论,请参阅How to avoid having the same name for a class and it's namespace, such as Technology.Technology?

答案 2 :(得分:1)

您的using声明之外的namespace指令。编译器按以下顺序在这些位置搜索类型 命名空间:

  1. MyUtils.MyImplement.ImplementExitOnEscape(当前类型中的嵌套类型)
  2. MyUtils.MyImplement(当前命名空间中的类型或命名空间)
  3. MyUtils(“下一个”外层“中的类型或命名空间)
  4. null命名空间或全局命名空间(类型或命名空间)
  5. System.WindowsSystem.Windows.InputMyUtils.MyArgParser您拥有using的(类型或命名空间)
  6. 您输入了MyArgParser.< something>。

    (3。) 中找到匹配项,即名称空间。只有在(5.)中你的using才会有问题。所以MyArgParser指的是名称空间,而不是类型。

    如果您将using放在namespace区块内,情况会有所不同,请参阅an answer of mine in another thread

答案 3 :(得分:0)

可能没有什么理由:

  1. 与其他名称冲突

  2. 你的课程可能还有另一个名字。

  3. 使用Ctrl + J + K,然后搜索您的课程。看看VS是否找到了它。如果没有,那么可能是因为参与问题。您是否需要添加对该库的引用?