c# - 为什么在 C# 命名空间中会隐藏以命名空间名称的中间元素开头的其他命名空间?

标签 c# namespaces

namespace Y
{
  class foo { }
}
                    
namespace X.Z
{
  class bar : Y.foo { }
} // fine
                    
namespace X.Y.Z
{
  class bar2 : Y.foo { }
} // error!, now foo can't be found because it looks for X.Y.foo
这是一个c#错误吗?虽然我在命名空间中只是在命名空间中声明的项目名称前加上前缀。显然还有其他事情正在发生,我不确定这是一件好事。

最佳答案

所以

namespace X.Y.Z
{
  class bar2 : Y.foo { }
} 
只是简写:
namespace X
{    
    namespace Y
    {        
        namespace Z
        {
          class bar2 : Y.foo { }
        }         
    }    
}
(希望很清楚为什么速记实际上很有值(value)。)
所以现在是时候尝试解析标识符 Y.foo . C# 这样做的方式是它总是查看尽可能窄的范围,如果没有找到合适的匹配项,它就会向上移动一个级别。所以首先它会在 bar2 的定义范围内查找,并没有找到合适的候选人。然后它进入下一级命名空间 X.Y.Z .然后再上一级到命名空间 X.Y .现在我们有东西 Y可以匹配命名空间本身,它看起来匹配标识符 foo在里面,因为它是一个命名空间,再次发现什么都没有。
因为有合适的匹配 Y , 完成。任何时候可以解析标识符,即使它出错,它也不会继续搜索标识符可以解析的其他可能不会出错的内容。
根据需要解析标识符的一种方法是使用 global::前缀,这是一个关键字,可以防止整个“由内而外”的事情发生并强制标识符从根开始向下工作,允许您编写 global::Y.foo;并让它匹配你想要的类型。您还可以添加 using导入命名空间或为类型创建别名以正确解析类型。
当然,最好的解决方法是使用不同的命名空间名称来完全避免歧义问题,如果您可以控制的话。

关于c# - 为什么在 C# 命名空间中会隐藏以命名空间名称的中间元素开头的其他命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69184790/

相关文章:

c# - 已发布的 ASP.NET 核心站点 : Cannot find compilation library location for package 'Microsoft.AspNet.WebApi.Client' 出错

c# - 单元测试无效方法?

c# - 使用嵌套命名空间的类库问题

php - 在带有命名空间的 Phalcon 中使用相关模型

namespaces - 命名空间声明语句必须是第一个语句或在 elementor pro base-widget.php 脚本中的任何声明调用之后

java - 使用 Java 将命名空间数据从服务发送到客户端

c# - Sharepoint OLE DB - 无法插入记录? "Field not updateable"错误

c# - 不要在C#项目中显示连接字符串

clojure - 如何获取具有统一命名空间键的映射的命名空间?

c# - 如何将多个航路点发送到虚拟地球路由 Web 服务