全局名称空间接管使用名称空间

本文关键字:空间 全局 | 更新日期: 2023-09-27 18:21:19

我觉得这是一个愚蠢的问题,但我可以;我似乎不明白为什么会发生这种事。考虑以下内容:

// file: A.cs
class A {
    public static string ns = "global";
}

// file: myNamespace'A.cs
namespace myNamespace {
    class A {
        public static string ns = "myNamespace";
    }
}

// in some other file...
using myNamespace;
class myClass {
    public void myMethod() {
        Console.WriteLine(A.ns);
    }
}
// OUTPUT: global

现在,由于我已经声明要使用myNamespace;为什么编译器固执地试图使用全局版本而不是命名空间版本?如果要这样做,使用有什么意义?

当然,我真正的代码比这更复杂。在我在(Unity API)中遇到的实际代码中,我在一个更像这样的情况下得到了一个编译错误:

A myObj = gameObject.GetComponent<A>();

这给了我一个论点的例外。不确定这是否与泛型有关?我是不是错过了一些非常愚蠢的东西?

全局名称空间接管使用名称空间

我现在无法测试它或找到规范,但我相信解析规则会搜索调用代码首先所在的命名空间。由于调用代码在全局名称空间中,因此首先搜索该名称空间。如果您将调用代码放在myNamespace命名空间中,我怀疑您会得到您想要的行为。

如果调用代码不在命名空间中,那么您应该得到一个"不明确类型"的编译器错误。

还要注意,您的类默认情况下是internal,尽管如果您的类都在同一个程序集中,这应该是一个问题。