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/