当您重载运算符(例如operator +
)时,编译的CIL看起来像这样:
.method public hidebysig specialname static bool op_Addition(...) { ... }
为什么在这里使用名称op_Addition
而不是名称+
?
我建议CIL语法应该是
.method public hidebysig specialname static bool +(...) { ... }
成员名称在查找时,应为+
而不是op_Addition
。
注意:这是关于语言设计的问题; “因为规范这么说”并不是一个有用的答案。
答案 0 :(得分:13)
如果您将方法命名为+
,那么只有支持运算符重载的语言或允许+
作为标识符的语言才能调用基础方法。
编程语言中的Unicode标准defines a syntax for identifiers(参见附件7)由CLS用于标识符规则,在该语法中不包括+
。由于大多数支持Unicode标识符的语言都遵循该语法,因此期望这些语言允许+
作为标识符是不合理的。
答案 1 :(得分:1)
CLR不了解运算符,因此c#编译器生成具有特殊名称的方法,以便其他不支持运算符的.net语言可以将它们作为方法使用。
CLR Via c#是此类问题的一个很好的参考。