9

私は、大部分が大きな配列のラッパーであり、関連するハウスキーピングであるクラスを持っています。ref パラメーターを取る関数があります。クラスのインスタンスを関数に渡すときに、配列が送信されるようにします。

明示的なキャストを検討しました。byte[] ref パラメータを持つ関数があるとします。

    public void SomeFunction(ref byte[] someBytes);

そして、オーバーロードされた明示的なキャストを持つクラスがあること。

    class SomeClass
    {
        byte[] someBytes;
        public static explicit operator byte[](SomeClass someInstance)
        {
            return someInstance.someBytes;
        }
    }

今、クラスをパラメーターとして関数を呼び出したい

    SomeClass someInstance = new SomeClass();
    SomeFunction(ref (byte[]) someInstance);

コンパイラは、「ref または out 引数は割り当て可能な変数でなければなりません」と文句を言います。コンパイラを適切にマッサージできていないだけなのか、それとも本当にそれができないのかはわかりません。

プロパティまたは関数の戻り値を検討しましたが、それらを参照で渡すことはできません (そして、自分自身を教育した後、理由がわかりました...)

配列を public フィールドにしたくないのですが、それはコンパイラを満足させます。配列を参照するローカル変数を作成することもできると思いますが、それは各関数呼び出しの前後に余分なコード行です...

編集: SomeFunction はサードパーティによって作成されたものであり、変更するアクセス権がないことに注意してください。さらに悪いことに、それらのパラメーターを実際に参照する必要はないと思います...

4

4 に答える 4

9

キャストは割り当て可能な変数ではありません。明示的なキャスト演算子からの戻り値を渡しています。

ref として渡す前に、適切にキャストされた値を保持する変数を作成できます。

SomeClass someInstance = new SomeClass();
byte[] someBytes = (byte[])someInstance;
SomeFunction(ref someBytes);

someBytes再割り当てできるのは変数であることに注意してください。の内部値を再割り当てする場合someInstance.someBytesは、呼び出しの後に何らかの方法で再割り当てする必要があります。SomeFunctionsomeInstance

于 2010-01-29T23:21:58.930 に答える
1

それはできません。最初にオブジェクトを変数にキャストした結果を具体化する必要があります。

要求が許可されている場合は、次のコードを検討してください。

public void SomeFunction(ref byte[] someBytes)
{
    someBytes = new byte[] { 1, 2, 3 };
}

SomeClass someInstance = new SomeClass();
SomeFunction(ref (byte[]) someInstance);
// uh-oh, what is "someInstance" now?

引数が「ref」とマークされているのはなぜですか。ここで解決しようとしている問題は何ですか?

于 2010-01-29T23:22:55.373 に答える
1

C# で ref パラメーターとして使用できる値の範囲は、CLR で許可される範囲によって制限されます。これは、セクション 12.4.1.5.2 および 12.1.6.1 の CLI 仕様で指定されており、含まれています

  • 現在のメソッドの引数
  • ローカル変数
  • オブジェクトのメンバー フィールド
  • 静的フィールド
  • 配列要素

refキャストはこれらのいずれにも適合しないため、値として使用できません。参照渡しする前に、ローカルなどの値に割り当てる必要があります。

于 2010-01-30T00:00:42.850 に答える