fea*_*net 13 c# compiler-construction parsing namespaces language-design
大会1
namespace Foo
{
public class Foo { }
}
Run Code Online (Sandbox Code Playgroud)
大会2
using Foo;
public class Bar
{
Foo foo = new Foo();
}
Run Code Online (Sandbox Code Playgroud)
我今天发现上面给出了错误Type name expected but namespace name found.
我觉得这很令人惊讶.据我所知,您不能声明命名空间变量,也不能声明new()命名空间.Foo是一个类型,它正在解析器期望找到一个类型的地方使用,那么为什么解析器无法正确解析它?我忽略了哪种语言功能,这意味着编译器团队无法实现此功能?
Jon*_*eet 15
埃里克利珀的博客文章(零件一个 ; 2 ; 3 ; 4)提供良好的洞察到这一点.从第一部分:
这揭示了关于C#中"类型绑定"算法设计的一个有趣观点.也就是说,确定名称如"XY"的类型或命名空间的算法正在讨论.我们不"回溯".我们不说"好吧,假设X意味着这个.然后Y没有任何意义.让我们回过头来; 假设X意味着另一件事,哦,是的,那么Y就有了意义."我们弄清楚X的含义是什么,只有这样我们才能弄清楚Y的意思.如果X不明确,我们不会检查所有可能性,看看它们中是否有Y,我们就放弃了.
这里,我们实际上只得到了一个X,但我认为,编译器试图找出这是否意味着它是一个命名空间或类型检查是否有别的什么事之后它之前.
就个人而言,我不介意这种限制.这意味着你不鼓励编写带有命名空间和类的代码同样的东西 - 从人类的角度来看这是一个令人困惑的情况,我很高兴它被劝阻.