静态解析重载运算符的原因是什么?对我来说这似乎是一个奇怪的选择 - 我能想到的唯一优点是性能上的小增益(但JIT可能有时会避免这种情况),代价是一些相当不直观的行为 - 也就是说,我基本上必须将运营商转移到一个虚拟函数来获得想要的行为。运算符重载 - 为什么静态解析?
这是刚从C++接管,还是有一些其他原因呢?
静态解析重载运算符的原因是什么?对我来说这似乎是一个奇怪的选择 - 我能想到的唯一优点是性能上的小增益(但JIT可能有时会避免这种情况),代价是一些相当不直观的行为 - 也就是说,我基本上必须将运营商转移到一个虚拟函数来获得想要的行为。运算符重载 - 为什么静态解析?
这是刚从C++接管,还是有一些其他原因呢?
见埃里克Lipperts文章Why are overloaded operators always static in C#?
相反,我们应该问自己,当与潜在的语言特性面临的这个问题:“请问功能的诱人的好处证明所有的费用?”成本远远超过设计,开发,测试,记录和维护功能的普通美元成本。还有更多微妙的成本,比如,这个功能会使得将来更改类型推理算法更加困难吗?这是否会导致我们进入一个没有引入向后兼容性中断的环境,我们将无法进行更改?等等。
在这种特殊情况下,令人信服的好处很小。如果您想在C#中使用虚拟调度的重载操作符,则可以非常轻松地从静态部分构建一个操作符。 [...]
它可以支持基于实例运营,但C#语言的设计者并没有看到大的收益相比,使其正常工作所需要的努力。
考虑将运算符重载为引用类型的情况。它可以是运营商两侧的null
。
如果操作符是实例方法,它们将不起作用。
但斯卡拉允许“运算符重载“在引用类型上:`x * y`与解析后的Scala中的`x.multiply(y)`没有区别。 – 2011-12-15 21:03:11
有两件事情来了我的头顶,其中任一个会恕我直言,足以本身打破了这笔交易:
virtual
方法仅基于this
的运行时类型进行调度。
“设计决定”..现在,Eric在哪里? ;-)另一个有点相关的问题是“为什么不默认虚拟方法”? – 2011-12-15 21:01:04
他在这里: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