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)
为什么我不得不使用的全名空间MyArgParser类var optionX = MyArgParser.MyArgParser.GetOptionValue("optionX");,而不是仅仅MyArgParser.GetOptionValue("optionX");?
using MyUtils.MyArgParser;被忽略了.在那里使用它不会有任何区别,编译器仍然强迫我使用完整的命名空间.
我发现这很奇怪,因为它并没有发生在任何地方.例如,我不需要在定义应用程序入口点的文件中使用完整命名空间.
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)
或者,完全参考它.
问题是你有一个与其命名空间同名的类,这意味着编译器无法将MyArgParser.GetOptionValue中的MyArgParser区分为命名空间或类.
由于每个文件顶部的不同using语句或名称与类名冲突的字段或变量,它可能会也可能不会强制您使用完整的命名空间.见埃里克利珀的博客文章(和部分2,3和4以获取更多信息的主题).
请参阅如何避免为类及其命名空间使用相同的名称,例如Technology.Technology?有关此问题的更多讨论.