我想在一个类中重载一个操作符,并将其私有化,以便它只能在类中使用。
但是,当我尝试编译时,我收到错误消息“用户定义的运算符 ... 必须声明为静态和公共的:
为什么他们必须公开?
我想在一个类中重载一个操作符,并将其私有化,以便它只能在类中使用。
但是,当我尝试编译时,我收到错误消息“用户定义的运算符 ... 必须声明为静态和公共的:
为什么他们必须公开?
要回答您问题的一半,您可以查看 Eric Lippert 的博客文章。
相反,当面对潜在的语言功能时,我们应该问自己的问题是“该功能的令人信服的好处是否证明所有成本都是合理的?” 成本远远超过设计、开发、测试、记录和维护功能的普通美元成本。还有更微妙的成本,比如,这个特性会不会让未来改变类型推断算法变得更加困难?这是否会导致我们进入一个如果不引入向后兼容性中断就无法进行更改的世界?等等。
在这种特定情况下,引人注目的好处很小。如果你想在 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 不是,这严重破坏了我们对加法运算符应该如何表现的直觉。
对于您的问题的另一部分:为什么它们应该是 public。
我无法找到任何真实的来源,但是 IMO,如果它们不会公开,并且只能在类中使用,那么可以使用简单的私有方法而不是重载运算符来完成。
您可能会看到 RB Whitaker 的博客文章
所有运算符重载都必须是公共的和静态的,这应该是有意义的,因为我们希望在整个程序中都可以访问运算符,并且因为它属于整个类,而不是类的任何特定实例。