运算符重载 - 为什么静态解析?

时间:2011-12-15 21:00:01

标签: c# operator-overloading

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

这是刚从C ++接管还是有其他充分的理由呢?

3 个答案:

答案 0 :(得分:2)

考虑为参考类型重载运算符的情况。它可能是运营商两边的null

如果运算符是实例方法,它们就不起作用。

答案 1 :(得分:2)

有两件事情从我的头脑中脱颖而出,其中一件恕我直言就足以打破这笔交易:

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

答案 2 :(得分:2)

见Eric Lipperts文章Why are overloaded operators always static in C#?

  

相反,我们在面对潜在的语言特征时应该问自己的问题是“该功能的令人信服的好处是否证明了所有成本?”而且成本远远超过设计,开发,测试,记录和维护功能的平凡美元成本。还有更微妙的成本,例如,此功能是否会使将来更改类型推理算法变得更加困难?这会导致我们进入一个我们无法在不引入向后兼容性中断的情况下进行更改的世界吗?等等。

     

在这种特殊情况下,引人注目的好处很小。如果你想在C#中拥有一个虚拟调度重载操作符,你可以很容易地构建一个静态部分。 [...]

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