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

Ine*_*elp 1 c# namespaces class

我创建了以下类:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么我不得不使用的全名空间MyArgParservar optionX = MyArgParser.MyArgParser.GetOptionValue("optionX");,而不是仅仅MyArgParser.GetOptionValue("optionX");

using MyUtils.MyArgParser;被忽略了.在那里使用它不会有任何区别,编译器仍然强迫我使用完整的命名空间.

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

Err*_*Efe 7

var optionX = MyArgParser.MyArgParser.GetOptionValue("optionX"); 
Run Code Online (Sandbox Code Playgroud)

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

要解决它,要么将MyArgParser名称空间更改为(例如)MyArgParserNS,您可以直接使用它

using MyUtils.MyArgParserNS
Run Code Online (Sandbox Code Playgroud)

然后:

var optionX = MyArgParser.GetOptionValue("optionX"); 
Run Code Online (Sandbox Code Playgroud)

或者,完全参考它.


akt*_*ton 6

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

由于每个文件顶部的不同using语句或名称与类名冲突的字段或变量,它可能会也可能不会强制您使用完整的命名空间.见埃里克利珀的博客文章(和部分2,34以获取更多信息的主题).

请参阅如何避免为类及其命名空间使用相同的名称,例如Technology.Technology?有关此问题的更多讨论.