显然,C# 和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<b<c>>' 解析为算术表达式或泛型类型/方法?
在成功之前,它肯定不会尝试对程序的文本进行多次“遍历”,或者是吗?这将需要无限的前瞻,而且也非常复杂。