[当我意识到可能无法区分使用<
运算符的表达式和类或方法的类型参数时,我正在创建自己的静态类型的语言。
主要原因是,像C#一样,不必在使用类之前就全部声明它们,因此,当在<
之后解析标识符时,它可能是诸如valueA < valueB
的表达式或者它可能是类型参数,例如valueA<valueB>
。
所以我想,也许有一个>
结束符,则可以将其解析为类型参数,但是后来我想起了我想让我的语言具有运算符重载功能,因此valueA < valueB > (valueC)
这样的表达式可能是完全有效的。
我决定尝试使用其他语言,但发现C#与我尝试创建的语言最相似,并且我可能已经破坏了它。
由于下面的类具有重载的foo < bar > (2)
和<
运算符,因此以下代码中的>
表达式应该是完全有效的表达式。
据我所知,该表达式应解析为(foo < bar) > (2)
,但我收到一条错误消息,指出"The variable 'foo' cannot be used with type arguments."
为证明该表达式应该是有效的,我将<
和>
翻转了符号,使表达式看起来像foo > bar < (2)
,并且该程序完全编译并打印出了您期望的MainClass+baz
。
在此特定示例中,编译器可能会发现这一点,因为它知道foo
是一个变量,并且可以假定<
表示一个表达式,但是如果foo是另一个类的静态成员,则将无法区分<
表达式和类型参数。
using System;
class MainClass {
public static void Main (string[] args) {
baz foo = new baz();
baz bar = new baz();
// perfectly valid expression, results in error: The variable `foo' cannot be used with type arguments
Console.WriteLine(foo < bar > (2));
}
class baz {
public static baz operator<(baz l, baz r) {
return l;
}
public static baz operator>(baz l, baz r) {
return l;
}
public static baz operator<(baz l, int r) {
return l;
}
public static baz operator>(baz l, int r) {
return l;
}
}
public String toString() {
return "baz";
}
}
我的问题是,如何在C#编译器和其他语言中解决此问题?
我看到一些选择:
也许对此有某种标准,但是我认为接受这一点只是疏忽,我们至少应该选择选项1。
foo
是局部变量,但是您尝试将其用作类类型名称...