我创建了以下类:
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;
被忽略了。不管它是否存在都没有任何区别,编译器仍然强迫我使用完整的命名空间。
我发现这很奇怪,因为它并没有发生在任何地方。例如,我不需要在定义应用程序入口点的文件中使用完整命名空间。
答案 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(以及部分2,3和4)。
有关此问题的详细讨论,请参阅How to avoid having the same name for a class and it's namespace, such as Technology.Technology?。
答案 2 :(得分:1)
您的using
声明之外的namespace
指令。编译器按以下顺序在这些位置搜索类型 或 命名空间:
MyUtils.MyImplement.ImplementExitOnEscape
(当前类型中的嵌套类型)MyUtils.MyImplement
(当前命名空间中的类型或命名空间)MyUtils
(“下一个”外层“中的类型或命名空间)System.Windows
,System.Windows.Input
和MyUtils.MyArgParser
您拥有using
的(类型或命名空间)您输入了MyArgParser.
< something>。
在 (3。) 中找到匹配项,即名称空间。只有在(5.)中你的using
才会有问题。所以MyArgParser
指的是名称空间,而不是类型。
如果您将using
放在namespace
区块内,情况会有所不同,请参阅an answer of mine in another thread。
答案 3 :(得分:0)
可能没有什么理由:
与其他名称冲突
你的课程可能还有另一个名字。
使用Ctrl + J + K,然后搜索您的课程。看看VS是否找到了它。如果没有,那么可能是因为参与问题。您是否需要添加对该库的引用?