4

私は最近この質問をしました: カスタム C# 拡張メソッドを参照するコンパイラ エラー

Marc Gravell の回答は完璧で、私の問題を解決しました。でも、考えるきっかけになりました…

拡張メソッドを静的クラスに配置する必要があり、メソッド自体が静的でなければならない場合、静的な拡張メソッドを作成できないのはなぜですか?

「this」とマークされたパラメーターは、拡張するオブジェクトのインスタンスへのアクセスを許可するために使用されることを理解しています。私が理解していないのは、メソッドを静的に作成できない理由です...これは無意味な制限であるように思えます...

私の質問は、静的メソッドとして機能する拡張メソッドを作成できないのはなぜですか?

4

4 に答える 4

7

本当の答えは単純だと思います。良いユースケースはありませんでした。たとえば、利点は、既存のタイプ (それ自体はロジックを提供しない) よりも流暢な API を有効にすることです。

var foo = data.Where(x=>x.IsActive).OrderBy(x=>x.Price).First();

これにより、LINQ が有効になります。

var foo = (from x in data
           where x.IsActive
           order by x.Price
           select x).First();

静的メソッドでは、これは単純に問題ではないため、正当な理由はありません。2 番目のタイプで静的メソッドを使用するだけです。

そのままでは、拡張メソッドは適切にオブジェクト指向ではありません。純粋さを犠牲にして生活を楽にするための実用的な悪用です。静的メソッドを同じように希釈する理由はありませんでした。

于 2009-03-12T14:33:13.723 に答える
3

その機能は C# には存在しないためです。

回避策として、静的メソッドを別のクラスに実装し、そのクラスを介して呼び出して、追加機能を提供することができます。

たとえば、XNA には、理想的にはMathクラスの静的拡張であるMathHelperクラスがあります。

コミュニティは、C# 4.0 に適しているかどうかを尋ねています。

于 2009-03-12T14:32:55.937 に答える
1

私の考えは互換性のためです-この演算子を必要として突然すべての静的メソッド拡張メソッドを作成した場合、拡張メソッドで通常のメソッドをオーバーライドしているコードを誤って壊してしまう可能性があります。

このパラメーターは制御を可能にするため、互換性を損なうことはありません。

ただのアイデアです。

于 2009-03-12T14:45:12.790 に答える
0

まず、既存の型の静的メソッドを拡張することを示すために、さらに別の構文を追加する必要があります。構文を拡張するときは、そうする非常に正当な理由が本当に必要です。

MyClass に拡張メソッドを追加できる MyExts というクラスがあるとします。なぜだろう: -

MyClass.DoSomethingExtra();

よりも優れている

MyExts.DoSomethingExtra();

?

于 2009-03-12T14:34:52.813 に答える