c# - C# 如何知道如何正确修改命名空间以使其工作?
问题描述
C# 如何知道如何正确修改命名空间以使其工作?
最近我遇到了一个看似简单的概念,但我对正在发生的事情缺乏清晰的理解感到震惊。一个简单的谷歌搜索并没有帮助我获得更好的照片。所以,我提出这个问题。
我有一个包含两个文件的项目:
文件1.cs
namespace A.B.C
{
using E.F;
public class D
{
G g;
}
}
文件2.cs
namespace A.B.E.F
{
public class G { }
}
现在,在我的同事指出这一点之前,我从未遇到过这种情况,尽管我阅读了一些关于 C# 的深入书籍并且在使用 C# 方面有相当长的经验。所以,这里 C# 解析器做了一件非常聪明的事情。他using E.F;
从File1.cs中获取,获取封闭的命名空间(即namespace A.B.C
),从封闭的命名空间中移除C
并将 添加E.F
到剩余的命名空间部分。最后得到using A.B.E.F
。
修改对我来说似乎一点也不简单。编译器现在应该从 中删除多少尾随命名空间A.B.C
(在本例中为 1 - 即C
),以便添加E.F
会导致包含class G
.
现在我问我对正在发生的事情的理解是否正确,我在哪里可以阅读编译器所做的这些修改?
更新
如果我们获取以下文件:
文件1.cs
namespace A.B.C
{
using E.F;
public class D
{
G g;
}
}
文件2.cs
namespace A.B.E.F
{
public class G { }
}
namespace E.F
{
}
编译器仍然能够准确定位File1.csA.B.E.F
中的行,而不是. 因此,编译器不只是寻找注释中指出的命名空间,而是寻找包含. 如果我错了,请纠正我。using E.F;
E.F
E.F
E.F
class G
更新 2
指向这个(来自@Damien_The_Unbeliever)文档的评论让我想到了File1.cs和File2.cs的第一个版本。从某种意义上说,它们产生的结果是这样的:
namespace A
{
namespace B
{
namespace C
{
using E.F;
public class D
{
G g;
}
}
namespace E
{
namespace F
{
public class G { }
}
}
}
}
现在我们可以using E.F
通过命名空间链向上移动。命名空间E.F
是从命名空间开始定义的A.B
,因此以下是合法的:
namespace A
{
namespace B
{
using E.F;
namespace C
{
public class D
{
G g;
}
}
namespace E
{
namespace F
{
public class G { }
}
}
}
}
虽然以下是不合法的,因为在命名空间中A
我们仍然不知道E.F
命名空间:
namespace A
{
using E.F;
namespace B
{
namespace C
{
public class D
{
G g;
}
}
namespace E
{
namespace F
{
public class G { }
}
}
}
}
但是,我们知道B.E.F
namespace 中的命名空间A
,所以以下是合法的:
namespace A
{
using B.E.F;
namespace B
{
namespace C
{
public class D
{
G g;
}
}
namespace E
{
namespace F
{
public class G { }
}
}
}
}
所以,我的猜测是我关于 C# 计算命名空间的第一个假设是错误的。实际上 C# 不计算命名空间,而只知道每个给定命名空间中的一组命名空间。在某些情况下,某些命名空间可能有多个名称。例如,命名空间在A.B.E.F
命名空间内具有以下名称A.B
:A.B.E.F
, B.E.F
, E.F
. 所有 3 个命名空间名称都指向同一个命名空间。我的理解正确吗?
解决方案
推荐阅读
- docker - 'docker run' 使用挂载卷选项 '-v' 并带有单个目录作为参数(源和目标不使用冒号 (":") 分割)
- kotlin - 检查地图的值是否具有三元组中的所有键 - Kotlin
- javascript - Trying to extract items from a nested javascript object tree using recursion
- javascript - 将反应表单数据上传到 Firebase 时出现问题
- google-maps - 如何在颤动中为谷歌地图创建自定义图像标记,并在自定义小部件中创建它?
- python - 如何导入烧瓶重新上传的模块
- java - ?:在Java中:如何更合理地结合res和resString?
- reactjs - 这段代码狙击是做什么的还是只是一个错误
- dc.js - 如何在饼图和条形图标签中显示当前值,例如在工具提示中?
- javascript - 反应道具和状态