在下面的代码中
namespace Too
{
public class Foo
{
}
}
namespace Foo
{
public class Boo : Foo
{
}
}
我收到错误
'foo' is a namespace but is used like a type
。如果我将继承中的
Foo
类名完全限定为Too.Foo
,该错误就会消失。为什么编译器会尝试在 namespace 没有意义的地方尝试解析
Foo
命名空间而不是类?
最佳答案
编译器在初次解析名称时并不在乎您的引用是类还是 namespace 。如果名称不完全合格,它将始终尝试首先在本地 namespace 中找到它-包括 namespace 名称本身。如果在本地 namespace 中找不到它,它将尝试using
指令。
之所以这样解决,是因为您最终可以创建一个 namespace 层次结构,并且所有类和 namespace 都由.
分隔。因此,在解析名称时,编译器并不在乎类型,而仅在乎层次结构路径。一旦找到匹配项,它就会关心类型。在这种情况下,当它需要一个类并因此失败时,它是一个 namespace 。
对于子命名空间和子类,如果编译器仅尝试匹配一个子命名空间和子类,则很难找到匹配项;如果仅匹配同一程序集中的随机 namespace ,则可能会找到多个引用。因此,它始终始终是本地 namespace ,然后在层次结构中向上移动到其他程序集。如果由于两个都被引用的不同 namespace 中存在两个具有相同名称的子 namespace 或类而导致不清楚,则您必须更加清楚。
关于c# - 为什么编译器与继承中的 namespace 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56240461/