类与命名空间共享名称时发生 C# 错误

问题描述 投票:0回答:1

组装1

namespace Foo
{
    public class Foo { }
}

组装2

using Foo;

public class Bar 
{ 
    Foo foo = new Foo();
}

我今天发现上面给出了错误

Type name expected but namespace name found

我觉得这很令人惊讶。据我所知,您不能声明名称空间变量或 new() 名称空间。

Foo
是一种类型,它被用在解析器期望找到类型的地方,那么为什么解析器不能正确解析它呢?我忽略了哪些语言功能,这意味着编译器团队无法实现此功能?

c# parsing namespaces language-design
1个回答
17
投票

Eric Lippert 的博客文章(onetwo Threefour)对此提供了很好的见解。从第一部分开始:

这揭示了 C# 中“类型绑定”算法设计的一个有趣点。也就是说,确定像“X.Y”这样的名称所谈论的类型或名称空间的算法。我们不“走回头路”。我们不会说“好吧,假设 X 就是这个意思。那么Y就没有意义了。让我们回溯一下;假设 X 表示其他事物,哦,是的,那么 Y 就有意义。”我们明确地弄清楚 X 的含义,然后才能弄清楚 Y 的含义。如果 X 不明确,我们不会检查所有可能性来看看其中是否有 Y,我们就会放弃。

这里我们实际上只是得到一个X,但我认为编译器会在检查它后面是否还有其他东西之前尝试弄清楚这是否意味着它是命名空间还是类型

就我个人而言,我不介意这个限制。这意味着您不鼓励使用命名空间和类来编写代码,因为从人类的角度来看,这是一个令人困惑的情况,我很高兴它被劝阻。

© www.soinside.com 2019 - 2024. All rights reserved.