【发布时间】:2012-05-16 00:06:40
【问题描述】:
显然,C# 很容易受到“>>”词法分析器困境as is C++ 的影响。
这段 C# 代码非常有效,编译和运行都很好:
var List = new Dummy("List");
var Nullable = new Dummy("Nullable");
var Guid = new Dummy("Guid");
var x = List<Nullable<Guid>> 10;
var y = List<Nullable<Guid>> .Equals(10,20);
您必须为上面的 Dummy 类重载“>”运算符。
但编译器设法猜测在“x”情况下的含义是使用 List、Nullable 和 Guid 局部变量。在 'y' 的情况下,它突然决定将它们视为知名类型的名称。
这里有一个更详细的描述和另一个例子: http://mihailik.blogspot.co.uk/2012/05/nested-generics-c-can-be-stinky.html
问题是:C# 编译器如何将 'a>' 解析为算术表达式或泛型类型/方法?
在成功之前,它肯定不会尝试对程序的文本进行多次“遍历”,或者是吗?这将需要无限的前瞻,而且也非常复杂。
【问题讨论】:
-
“选择一个意思而不是另一个意思?” ... 你是什么意思?这里有一个单一的、明确的含义……唯一不明确的原因是变量名的选择。
-
'a>' 的含义非常依赖于上下文。编程语言允许这样做是不寻常的。嗯,实际上主要问题是编译器如何决定它是算术移位还是泛型类型规范的一部分。
-
如果你足够疯狂地超载 '>' 你应该期待你得到什么。
-
这让我想起了the
-->and<--operators ;) -
这不是因为我疯狂到使用该语言的合法特性,而是关于编译器如何解决这个谜题。你我看语法,套用常识,但编译器需要明确的规则,没有常识。
标签: c# lexer nested-generics