我通过反射器查看String和Int32类型,但找不到任何已定义的运算符.
如果它们没有定义,+/ - 等如何在这些类型上运行?
数字运算符是IL本身的一部分.字符串上的"+"运算符有点特殊 - 它不会被字符串类型本身重载,它由编译器完成.C#编译器翻译:
string x = a + "hello" + b;
成:
string x = string.Concat(a, "hello", b);
这比使用普通运算符进行连接更有效,因为否则必须在每个连接处创建新字符串.
String类只有两个,它们具有符合CLS的名称:op_Equality和op_Inequality.编译器具有许多System.String类的内置知识.必要的是为了能够使用Ldstr操作码.同样,它将+运算符转换为String.Concat().
几乎是Int32的故事,运营商和IL操作码之间存在直接匹配.