2011-12-15 132 views
2

静态解析重载运算符的原因是什么?对我来说这似乎是一个奇怪的选择 - 我能想到的唯一优点是性能上的小增益(但JIT可能有时会避免这种情况),代价是一些相当不直观的行为 - 也就是说,我基本上必须将运营商转移到一个虚拟函数来获得想要的行为。运算符重载 - 为什么静态解析?

这是刚从C++接管,还是有一些其他原因呢?

+4

“设计决定”..现在,Eric在哪里? ;-)另一个有点相关的问题是“为什么不默认虚拟方法”? – 2011-12-15 21:01:04

+3

他在这里:http://blogs.msdn.com/b/ericlippert/archive/2007/05/14/why-are-overloaded-operators-always-static-in-c.aspx – 2011-12-15 21:03:29

回答

2

见埃里克Lipperts文章Why are overloaded operators always static in C#?

相反,我们应该问自己,当与潜在的语言特性面临的这个问题:“请问功能的诱人的好处证明所有的费用?”成本远远超过设计,开发,测试,记录和维护功能的普通美元成本。还有更多微妙的成本,比如,这个功能会使得将来更改类型推理算法更加困难吗?这是否会导致我们进入一个没有引入向后兼容性中断的环境,我们将无法进行更改?等等。

在这种特殊情况下,令人信服的好处很小。如果您想在C#中使用虚拟调度的重载操作符,则可以非常轻松地从静态部分构建一个操作符。 [...]

它可以支持基于实例运营,但C#语言的设计者并没有看到大的收益相比,使其正常工作所需要的努力。

2

考虑将运算符重载为引用类型的情况。它可以是运营商两侧的null

如果操作符是实例方法,它们将不起作用。

+1

但斯卡拉允许“运算符重载“在引用类型上:`x * y`与解析后的Scala中的`x.multiply(y)`没有区别。 – 2011-12-15 21:03:11

2

有两件事情来了我的头顶,其中任一个会恕我直言,足以本身打破了这笔交易:

  1. 哪个运营商?二进制运算符有两个操作数,并且动态调度基于两个参数的类型不可用! “经典”virtual方法仅基于this的运行时类型进行调度。
  2. 什么是用例证明额外的复杂性?