c# 中的运算符重载约束

问题描述 投票:0回答:2

问)为什么 C# 中的运算符重载需要“public”和“static”?

尝试过这篇文章

https://learn.microsoft.com/en-us/archive/blogs/ericlippert/why-are-overloaded-operators-always-static-in-c

但是有人可以解释一下作者想说什么吗?

c# operator-overloading
2个回答
2
投票

作者以非静态方式对运算符重载的潜在特性进行了简单的成本/收益分析,并得出结论,收益并不能证明成本的合理性:您可以通过分派到一个实例来轻松模仿运算符实例重载的功能。来自静态重载运算符内部的虚拟方法。然而,让您在没有中间虚函数的情况下定义重载运算符的成本是巨大的:

  • 您在操作员的工作方式中引入了不对称性(
    2+c
    可能是非法的,而
    c+2
    是可以的)
  • 您需要处理左侧的
    null
    参考文献
  • 单次调度无论如何都无法解决您的问题,因此您最终会在操作员内部进行额外的调度工作

最后,作者指出,他们并没有引入一个会带来很多混乱而没有显着好处的功能,而是选择了一种更简洁的设计,可以扩展以提供可比较的功能级别。


0
投票

公共是必要的,这样就可以在课堂之外访问。 静态是必要的,因为不在类的实例上调用它。

public class B {
    public static B operator+(B b1, B b2) { return b1.Add(b2); }
    protected virtual B Add(B b2) { // ...

对于上面的例子,我可以有像

b3 = b1 + b2
这样的代码,这里+运算符不会在类B的任何一个实例上调用,所以它需要是静态的。 希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.