为什么必须将重载运算符声明为公共?

时间:2012-10-31 02:13:16

标签: c#-4.0 operator-overloading

我想重载一个类中的运算符,并将其设置为私有,以便它只能在类中使用。
但是,当我尝试编译时,我收到错误消息“用户定义的操作符...必须声明为static and public:

为什么他们必须公开?

1 个答案:

答案 0 :(得分:0)

要回答问题的一半,您可能会看到Eric Lippert撰写的博客文章。

Why are overloaded operators always static in C#?

  

相反,我们在面对时应该问自己的问题   潜在的语言特征是“具有令人信服的好处   功能证明了所有的成本?“而且成本远远超过   只是设计,开发,测试的平凡美元成本,   记录和维护功能。有更微妙的成本,   比如,此功能是否会使更改类型变得更加困难   未来的推理算法?这是否将我们带入一个世界   在没有向后引入的情况下我们将无法进行更改   兼容性中断?等等。

     

在这种特殊情况下,引人注目的好处很小。如果你想   在C#中有一个虚拟调度的重载操作符,你可以构建一个   非常容易地摆脱静态部件。例如:

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

你有它。所以,好处很小。但成本是   大。 C ++ - 样式实例运算符很奇怪。例如,他们打破了   对称。如果你定义一个带有C和int的operator +,那么   c + 2是合法的,但2 + c不合法,这严重打破了我们的直觉   加法运算符应该如何表现。

对于您的问题的另一部分:为什么他们应该公开

我无法找到任何可靠的来源,但IMO,如果它们不是公开的,并且可能只在类中使用,那么这可以使用简单的私有方法,而不是重载的运算符来完成。

您可能会看到RB Whitaker的博客文章

Operator Overloading

  

所有操作符重载必须是公共的和静态的,这应该是   感觉,因为我们希望能够访问整个运营商   程序,因为它属于整个类,而不是任何类   该类的具体实例。