C# 运算符重载-为什么静态解析?
静态解析重载运算符的原因是什么?对我来说,这似乎是一个奇怪的选择——我能想到的唯一优势是以一些相当不直观的行为为代价获得一个小的性能增益(但JIT有时也可以避免),也就是说,我基本上必须将操作符转发到一个虚拟函数以获得想要的行为C# 运算符重载-为什么静态解析?,c#,operator-overloading,C#,Operator Overloading,静态解析重载运算符的原因是什么?对我来说,这似乎是一个奇怪的选择——我能想到的唯一优势是以一些相当不直观的行为为代价获得一个小的性能增益(但JIT有时也可以避免),也就是说,我基本上必须将操作符转发到一个虚拟函数以获得想要的行为 这是C++的替代品吗?或者还有其他的原因吗? 考虑重载引用类型的运算符时的情况。它可以是运算符任一侧的null 如果操作符是实例方法,它们就不起作用。有两件事我脑子里想不出来,其中任何一件都足以自己打破交易: 哪些运算符?二进制运算符有两个操作数,基于两个参数类型的动态
这是C++的替代品吗?或者还有其他的原因吗? 考虑重载引用类型的运算符时的情况。它可以是运算符任一侧的
null
如果操作符是实例方法,它们就不起作用。有两件事我脑子里想不出来,其中任何一件都足以自己打破交易:
virtual
方法仅基于this
的运行时类型进行调度参见Eric Lipperts的文章 相反,当我们面对一个潜在的语言特性时,我们应该问自己的问题是“该特性令人信服的优点是否证明了所有成本的合理性?”并且成本远远超过了设计、开发、测试、记录和维护一个特性的普通成本。还有更微妙的代价,比如,这个特性是否会使将来更改类型推断算法更加困难?这是否会导致我们进入一个世界,在这个世界中,如果不引入向后兼容性中断,我们将无法进行更改?等等 在这种特殊情况下,引人注目的好处很小。如果你想在C语言中有一个虚拟的重载操作符,你可以很容易地用静态部分构建一个
支持基于实例的操作符是可能的,但与使其正常工作所需的努力相比,C语言设计师没有看到巨大的收益。“设计决策”。。现在,埃里克在哪里?;-)另一个有点相关的问题是“为什么默认情况下方法不是虚拟的”?他在这里:但是Scala允许引用类型上的“运算符重载”:
x*y
与解析后Scala中的x.multiply(y)
没有什么不同。刚刚提出了一个反参数:)另外,我在这里对可为空的类型进行了一些修改,不知道它们在这一切中的位置:(int)?10>(int?)null
。。。最后是有道理的,但仍然引起了一些悲伤:(是的,你显然必须至少指定参数的计算方式(尽管xopy
beingx.op(y)
似乎是合乎逻辑的选择)我发誓Eric在他所有与C#design有关的文章中复制并粘贴了第一段:-)一位权威在这个主题上的链接很好,是的,他对一些可能的陷阱是正确的(而且解决方案也很简单,只是没有我希望的那么优雅)。