如果没有定义名称空间,类将具有什么名称空间

bar*_*ker 42 c# namespaces

在C#中,如果我创建一个没有命名空间的类,那么在尝试实例化类时我会使用什么命名空间?

例如,假设main是......

namespace NamespaceTests
{
    class Program
    {
        static void Main(string[] args)
        {

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

...并假设我的无命名空间类是......

public class test
{
    public string SayHello()
    {
        return "Hello World!";
    }
}
Run Code Online (Sandbox Code Playgroud)

...并假设我有一个相同名称的另一个类,但具有默认命名空间...

namespace NamespaceTests
{
    public class test
    {
        public string SayHello()
        {
            return "Hello Moon...";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

...我如何修改main以包含无名称空间类的实例,并调用'SayHello'来检索消息"Hello World!"?具体来说,我如何完全限定类'test'的无名称空间实例,特别是考虑到我可能有另一个类也称为'test'但具有命名空间,所以我需要区分...

Dav*_*ell 47

它位于全局命名空间中,可以像这样引用:

var x = new global::test();


its*_*e86 11

未在命名空间中定义的类型将位于全局命名空间中.

全局上下文关键字,当它出现在::运算符之前时,引用全局命名空间,它是任何C#程序的默认命名空间,否则是未命名的.

以下示例显示如何使用全局contextual关键字指定在全局命名空间中定义类TestApp:

C# class TestClass : global::TestApp { }
Run Code Online (Sandbox Code Playgroud)


and*_*lov 5

除了上述答案之外,重要的是要注意,所有类型,无论其声明位置如何,都有一个“完全限定名称”,该名称以“global::”开头

摘自“O'Relly. C# in a Nutshell”:

所有类型名称都在编译时转换为完全限定名称。中间语言 (IL) 代码不包含未限定或部分限定的名称