ホームページ >バックエンド開発 >C++ >C# 拡張メソッドの最初のパラメータを「ref」パラメータにできないのはなぜですか?

C# 拡張メソッドの最初のパラメータを「ref」パラメータにできないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-07 16:57:421017ブラウズ

Why Can't the First Parameter of a C# Extension Method Be a `ref` Parameter?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。