c# - 为什么使用命名空间以一种不直观的方式工作?

标签 c# generics namespaces

我在引用的项目中有一个命名空间,Project.Base ,并且有人认为在该命名空间中声明他们自己的通用 List 类是个好主意。

现在我有一个开始的代码文件:

using System.Collections.Generic;
using Project.Base.Sub;
Project.Base命名空间从未真正被正式使用过;只是其中的一个嵌套命名空间。 System.Collections.Generic正式使用。但是由于一些奇怪的原因,当我声明一个返回类型为 List<T> 的方法时,它将其解释为 Project.Base.List<T>而不是 System.Collections.Generic.List<T> !

这对我来说似乎非常违反直觉。有谁知道发生了什么以及如何解决它?

编辑 重现:
using System;
using System.Collections.Generic;
using Project.Base.Sub;

namespace Project.Base
{
    public class List<T> { }
}

namespace Project.Base.Sub { }

namespace Project.Base.Sub2
{

    public class P
    {
        public static void Main()
        {
            var list = new List<int>(); 
            Console.WriteLine(list.GetType().Namespace);
            Console.Read();
        }
    }
}

(请注意,有问题的代码位于 Project.Base 的不同子命名空间中。这似乎很重要。)

最佳答案

名称查找通过搜索封闭的命名空间进行,并且只考虑 using每个指令范围内的指令。

要进行此编译,您可以移动您的 using里面的指令:

using System;

namespace Project.Base
{
    public class List<T> { }
}

namespace Project.Base.Sub { }

namespace Project.Base.Sub2
{
    using System.Collections.Generic;

    public class P
    {
        public static void Main()
        {
            var list = new List<int>();
            Console.WriteLine(list.GetType().Namespace);
            Console.Read();
        }
    }
}

顶级using指令仅在全局命名空间内,因此只有在封闭命名空间中的查找失败时才会被搜索。因此,第一次查找未能找到 Project.Base.Sub2.List ,但在下一级别,它位于 Project.Base.List .如果失败,它会尝试定位 Project.List类型。

其他 using指令是一个红鲱鱼。

关于c# - 为什么使用命名空间以一种不直观的方式工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42263273/

相关文章:

java - 如何修复 : java. lang.ClassCastException : java. util.ArrayList 无法转换为 double[]

java泛型转换问题

xml - 为什么命名空间参数?

C# 结构 "this = ...."

c# - Xamarin 中的 Azure 移动服务 412 失败

c# - 通过提供邮政编码获取城市名称的 Web 服务

java - 需要帮助使这些类使用访问者模式和泛型

r - 将临时 namespace 附加到搜索路径

c++ - 使用指令与使用声明

C# 在消息框的标题中显示 unicode 文本