汇编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
是一种类型,它正在解析器期望找到类型的地方使用,那么为什么解析器无法正确解析它?我忽略了哪种语言功能,这意味着编译器团队无法实现此功能?
答案 0 :(得分:15)
Eric Lippert的博文(部分one; two; three; four)提供了很好的见解。从第一部分开始:
这揭示了关于C#中“类型绑定”算法设计的一个有趣观点。也就是说,确定名称如“X.Y”的类型或命名空间的算法正在讨论。我们不“回溯”。我们不说“好吧,假设X意味着这个。然后Y没有任何意义。让我们回过头来;假设X意味着另一件事,哦,是的,那么Y就有了意义。“我们弄清楚X的含义是什么,只有这样我们才能弄明Y是什么意思。如果X不明确,我们不会检查所有可能性,看看是否有任何Y,我们就放弃了。
这里我们实际上只是得到一个X,但是我想编译器在检查之前试图确定它是否是命名空间或类型是否还有其他任何内容。
就个人而言,我不介意这个限制。这意味着你不鼓励编写带有命名空间和类的代码同样的东西 - 而且从人的角度来看这是令人困惑的情况,我很高兴它不被劝阻。 / p>