【发布时间】:2020-02-08 04:04:59
【问题描述】:
当我想引用一个类名恰好与当前类的命名空间的一部分相同的类时,我发现 C# 处理命名空间的方式有些令人沮丧。这将产生一个编译器错误,“'Class' 是一个命名空间,但用作类型”。
考虑以下代码示例,它演示了问题:
namespace A.B.C
{
public class Y
{
}
}
namespace X.Y.Z
{
public class Class1
{
public Y MyProp;
}
}
在这种情况下,我想使用命名空间“A.B.C”中的类“Y”。但是因为“Y”也是命名空间的组成部分之一,所以 C# 将“Y”视为命名空间,而不是类型。
我可以通过完全限定类名“A.B.C.Y”或使用别名来解决此问题,但我的一般偏好是 C# 在此上下文中不将“Y”视为命名空间。通常我的代码(例如测试代码)包含与其测试的类相似的命名空间,而这种类/命名空间冲突意味着在设置时必须更加冗长。
我不确定该进程被称为什么,但似乎在解析类和命名空间时,C# 将遍历命名空间,直到找到匹配的命名空间的一部分。在这种情况下,它会向上走并找到 Y。有没有办法告诉 C# 不要向上走,不允许这种部分命名空间匹配?
【问题讨论】:
-
在这种情况下使用完全限定名称,或者为另一个命名空间添加
using语句,否则编译器不知道您引用的是命名空间还是类。 -
我相信这个过程叫做“命名空间解析”,是documented in the C# specification
-
@MattThurston 这个问题是问如何组织/命名命名空间和类。但是,OP 似乎暗示重命名命名空间或类不是一种选择。哦,这是真的吗?
-
我同意完全限定我正在使用的类的命名空间是一个合理的解决方案,只是有点麻烦。在这种情况下,命名空间解析的令人惊讶的方面是看似“部分”的命名空间解析,它匹配命名空间中间的一个单词。理想的解决方案是有某种方法来禁用这种“部分”命名空间匹配,并且需要显式的完全限定命名空间。所以在这个例子中,我希望“Y”本身不会被解释为命名空间。如果我想要那个命名空间,我会输入“X.Y”并完全限定它。
标签: c# namespaces