1. ホーム
  2. c#

[解決済み] C#の拡張メソッドによる演算子のオーバーロード

2022-04-20 01:41:54

質問

拡張メソッドを使用して、オペレーティング・オーバーロードを C# の StringBuilder クラスがあります。 具体的には、与えられた StringBuilder sb ということで、私は sb += "text" と同等になるように sb.Append("text") .

の拡張メソッドを作成する構文を以下に示します。 StringBuilder :

public static class sbExtensions
{
    public static StringBuilder blah(this StringBuilder sb)
    {
        return sb;
    }
} 

これは、正常に blah 拡張メソッドを StringBuilder .

残念ながら、演算子のオーバーロードは機能しないようです。

public static class sbExtensions
{
    public static StringBuilder operator +(this StringBuilder sb, string s)
    {
        return sb.Append(s);
    }
} 

その他の問題点として、キーワード this はこの文脈では使用できません。

拡張メソッドで演算子のオーバーロードを追加することは可能ですか? もし可能であれば、どのような方法が適切ですか?

どのように解決するのですか?

拡張メソッドは静的クラスでなければならず、静的クラスは演算子のオーバーロードを持つことができないため、現在のところこれは不可能です。しかし の機能が検討されています。 一部 C# の将来のリリース . Madsは、その実装についてもう少し話してくれました。 2017年のこの動画で .

現在実装されていない理由について、C#言語PMのMads Torgersen氏は次のように語っています。

...Orcasのリリースでは、我々は以下のことを決定しました。 を追加する慎重なアプローチをとります。 通常の拡張メソッドのみ ということです。 イベント、演算子、静的メソッド、などなど などです。通常の拡張メソッドは LINQに必要なものであり、かつ 構文的に最小限のデザインで には簡単に真似できないものがあります。 を、他のメンバー種別の

を意識するようになってきています。 他の種類の拡張メンバがあること は有用である可能性があるので、また戻ってくる予定です。 は、Orcasの後にこの問題に取り組みます。しかし 保証はないけどね。

同記事のさらに下。

申し訳ございませんが 次のリリースでは、このようなことを行う予定です。私たちは エクステンションメンバーは というのも、私たちの計画では を実現するために多くの労力を費やしました。 しかし、結局のところ、そのようなことはできませんでした。 ということになりました。 他の面白い機能へ

これはまだ将来のためのレーダーである。 をリリースしました。そのために必要なのは 説得力のあるシナリオを大量に 正しい設計のための一助となるものです。