c# - 为什么编译器与继承中的 namespace 冲突

标签 c# inheritance compiler-errors

在下面的代码中

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/

相关文章:

c# - 欧文认证:async method lacks 'await' operators

Javascript 私有(private)/公共(public)继承语法

c - 即使参数计数正确,也无法运行的参数太少

vb.net - 编译错误-vb.net 不是成员错误

c# - 用 Mono 编译 IronPython

c# - 注入(inject)依赖项作为方法参数而不是构造函数参数

c# - 我如何转换int?进入整数

C++ 如何获取对包含对象的引用?

c# - WebService、WebMethod 和继承

c# - WPF-错误 : [xxx] "does not contain a definition for [zzz] and no extension method [zzz] could be found