C# 拡張メソッド: 最初のパラメーターを (ほとんどの場合) ref
にできない理由
拡張メソッドは、ソース コードを変更することなく、既存の型に機能をエレガントに追加します。 ただし、重要な制限が存在します。メソッドが操作するインスタンスを表す最初のパラメーターは、ref
パラメーターにすることはできません (下記の例外を除きます)。
制限の背後にある理由
ref
キーワードを使用すると、メソッドは引数として渡された変数の値を直接変更できます。標準のメソッド呼び出しでは、これはまったく問題ありません。しかし、拡張メソッドの場合、最初のパラメータは拡張が呼び出されるオブジェクトを暗黙的に表します。 このパラメータを ref
にすると、拡張メソッドの動作方法が根本的に変わります。
拡張メソッドは、型の動作を拡張します。新しいインスタンスを置き換えたり作成したりしません。 最初の引数で ref
パラメータを許可すると、拡張メソッドは事実上、元のオブジェクトを完全に異なるオブジェクトに置き換えることになり、拡張メソッドの中心概念が壊れます。
具体例
通常の方法を考えてみましょう:
<code class="language-csharp">public static void Modify(ref MyClass obj, MyClass newObj) { obj = newObj; //Directly replaces the original object }</code>
ここで、類似の拡張メソッド (仮に許可されている) を想像してください。
<code class="language-csharp">public static void ModifyExtension(this ref MyClass obj, MyClass newObj) { obj = newObj; //Would replace the original object }</code>
この仮説的な拡張メソッドは元の obj
を変更せず、代わりにそれを参照する変数に新しいオブジェクトを割り当てます。この動作は、拡張メソッドの本来の目的と矛盾します。
C# 7.2 と値の型: 例外
この制限は通常、参照型 (クラス、インターフェイス) に当てはまりますが、C# 7.2 では値型 (構造体) に例外が導入されました。 構造体では、最初のパラメータ ref
で を使用することが許可されます。
以上がC# 拡張メソッドの最初のパラメータを「ref」パラメータにできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。