【问题标题】:C# Namespace question: Must avoid namespace containing any class name overlap?C#命名空间问题:必须避免命名空间包含任何类名重叠?
【发布时间】: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


【解决方案1】:

如果你在namespace X.Y.Z 中写入using A.B.C;Y 所在的命名空间),错误就会消失:

namespace X.Y.Z
{
    using A.B.C;
    public class Class1
    {
        public Y MyProp;
    }
}

【讨论】:

  • 谢谢,这真的很有帮助,而且我不知道。是时候去看看在命名空间中使用“使用”指令了,以及这与将“使用”放在命名空间之外有何不同......
猜你喜欢
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 2011-07-08
  • 1970-01-01
相关资源
最近更新 更多