如果没有定义命名空间,一个类会使用哪个命名空间?

69
在C#中,如果我创建一个没有命名空间的类,当尝试实例化该类时我将使用哪个命名空间?
例如,假设主要代码是...
namespace NamespaceTests
{
    class Program
    {
        static void Main(string[] args)
        {

        }
    }
}

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

public class test
{
    public string SayHello()
    {
        return "Hello World!";
    }
}

假设我有另一个同名的类,但它使用默认命名空间...

namespace NamespaceTests
{
    public class test
    {
        public string SayHello()
        {
            return "Hello Moon...";
        }
    }
}

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


3个回答

82

这是在全局命名空间中,可以按以下方式引用:

var x = new global::test();


注:此处的“global”为C#中的关键字,表示全局命名空间。

1
谢谢David - 示例完美运行。你的回答比@itsme86早了10秒 - 授予您先生。+1个示例... - barrypicker
1
这解决了由于同名类而产生的引用不明确的问题。其中一个有命名空间,另一个没有。它试图调用具有命名空间的那个并得到异常:error CS0117:'System.Web.Mvc.HtmlHelperExtensions'不包含'RenderPartialViewToString'的定义。 - GarDavis

16

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

全局上下文关键字,当它出现在::运算符之前时,指的是全局命名空间,这是任何C#程序的默认命名空间,否则它没有名称。

以下示例演示如何使用全局上下文关键字来指定TestApp类被定义在全局命名空间中:

C# class TestClass : global::TestApp { }

5
除了上面的答案外,需要注意的是,所有类型都有一个“完全限定名称”,无论其声明位置如何,该名称始于“global::”。
来自“O'Relly. C#入门指南”:
所有类型名称在编译时都会转换为完全限定名称。中间语言(IL)代码不包含未限定或部分限定的名称。

确实可以使用完全限定的对象并避免using语句来编写C#程序。using语句纯粹是一种简化代码以使其更易于阅读的句法糖。当存在大量类名相似的混淆时,完全限定类型并不使用using语句可能会更加清晰明了。 - barrypicker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接