我通过反射器查看String和Int32类型,但找不到任何定义的运算符。
如果没有定义,+ / - 等如何对这些类型起作用?
答案 0 :(得分:10)
数字运算符是IL本身的一部分。字符串上的“+”运算符有点特殊 - 它不会被字符串类型本身重载,它由编译器完成。 C#编译器翻译:
string x = a + "hello" + b;
成:
string x = string.Concat(a, "hello", b);
这比使用普通运算符进行连接更有效,因为否则必须在每次连接时创建一个新字符串。
答案 1 :(得分:5)
String类只有两个,它们具有符合CLS的名称:op_Equality和op_Inequality。编译器具有许多System.String类的内置知识。必要的是为了能够使用Ldstr操作码。同样,它将+运算符转换为String.Concat()。
Int32的故事,运营商和IL操作码之间存在直接匹配。
答案 2 :(得分:2)
原始操作符是一种痛苦,正如我在尝试编写generic support for operators时所发现的那样(即使用T + T等);还有一个讨论页面here that covers this。
您可以使用Expression
(.NET 3.5)这样的抽象来解决这个问题 - 否则,您将不得不查看原始IL,或者使用一些已知方法。
答案 3 :(得分:1)
是的,这些操作被转换为本机IL指令,而不是显式调用“operator +”方法。 它可能不是执行这些操作的托管代码......
答案 4 :(得分:1)
c#编译器是b的疯狂之子...我曾经试图重新创建Nullable类型的能力,直到在他的博客上发表一些评论时,Eric Lippert再次向我保证它的能力也来自于编译器在遇到可空类型时生成。