class で operator をオーバーロードし、それを private にして、クラス内からのみ使用できるようにしたいと考えていました。
ただし、コンパイルしようとすると、「ユーザー定義の演算子 ... は static および public として宣言する必要があります:
なぜ公開する必要があるのですか?
class で operator をオーバーロードし、それを private にして、クラス内からのみ使用できるようにしたいと考えていました。
ただし、コンパイルしようとすると、「ユーザー定義の演算子 ... は static および public として宣言する必要があります:
なぜ公開する必要があるのですか?
質問の半分に答えるには、Eric Lippert によるブログ投稿を参照してください。
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 によるブログ投稿が表示される場合があります。
すべての演算子のオーバーロードは public かつ static である必要があります。これは、プログラム全体で演算子にアクセスする必要があり、クラスの特定のインスタンスではなくクラス全体に属しているため、理にかなっています。