我在引用的项目中有一个命名空间,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/