0

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

试过这篇文章

http://blogs.msdn.com/b/ericlippert/archive/2007/05/14/why-are-overloaded-operators-always-static-in-c.aspx

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

4

2 回答 2

2

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

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

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

于 2012-12-07T17:30:38.220 回答
0

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

于 2012-12-07T17:26:40.193 回答