C# c语言中的运算符重载约束#

C# c语言中的运算符重载约束#,c#,operator-overloading,C#,Operator Overloading,Q) 为什么C#中的运算符重载需要“public”和“static” 我试过这篇文章 但是有人能解释一下作者想说什么吗 Public是必需的,以便可以在类外访问它。 静态是必需的,因为不在类的实例上调用它 public class B { public static B operator+(B b1, B b2) { return b1.Add(b2); } protected virtual B Add(B b2) { // ... 对于上面的示例,我可以使用类似于b3=b

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

我试过这篇文章


但是有人能解释一下作者想说什么吗

Public是必需的,以便可以在类外访问它。 静态是必需的,因为不在类的实例上调用它

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的任何一个实例上调用,因此它需要是静态的。
希望这能有所帮助。

作者以非静态的方式对运算符重载的一个潜在特性进行了简单的成本/收益分析,并得出结论,这些好处并不能证明成本是合理的:您可以通过从静态重载操作符内部调度到虚拟方法,轻松地模拟操作符实例重载的功能。但是,让您在没有中间虚拟函数的情况下定义重载运算符的成本非常高:

  • 您在操作符的工作方式中引入了不对称性(
    2+c
    可能是非法的,而
    c+2
    是可以的)
  • 您需要处理左侧的
    null
    引用
  • 单次调度无论如何都无法解决您的问题,因此您最终会在操作员内部执行额外的调度工作
最后,作者指出,他们没有引入一个会带来很多混乱而没有显著好处的特性,而是选择了一个更干净的设计,可以扩展以提供类似级别的功能