2

だから私はいくつかのフレームワーク2.0コードをReflectorしていますが、次の分解になります

fixed (void* voidRef3 = ((void*) &_someMember))
{
...
}

これは ' The right hand side of a fixed statement assignment may not be a cast expression' のためコンパイルされません

Reflector は概算しかできないことを理解しており、通常は明確なパスを確認できますが、これは私の経験から少し外れています。

質問: Reflector は私に何を説明しようとしていますか?

アップデート:

以下も見ています

fixed (IntPtr* ptrRef3 = ((IntPtr*) &this._someMember))

アップデート:

したがって、Mitch が言うように、これはビット単位の演算子ではなく、addressOf 演算子です。

質問は次のとおりです。

fixed (IntPtr* ptrRef3 = &_someMember)

Cannot implicitly convert type 'xxx*' to 'System.IntPtr*'. An explicit conversion exists (are you missing a cast?)' ' コンパイル エラーで失敗します。

だから私はそうするならのろわれ、そうしなければのろわれたように見えました。何か案は?

アップデート:

私はそれを考え出したと思います。たまたま、使用していた式に戻ってvoid*キャストを削除すると、VS は文句を言うのをやめました。この会話の参加者から同等のものを集めたので、void*単純intptr*にそれらを交換した結果、次のようになりました。

fixed (void* ptrRef3 = &_someMember)

そしてVSは不平を言うのをやめました。誰かがそれを確認できますか

fixed (void* ptrRef3 = &_someMember)

と同等です

fixed (IntPtr* ptrRef3 = &_someMember)

?

4

2 に答える 2

2

のアドレスを取得して_someMemberキャストし(void *)(つまり、ポインターアドレス)、そのアドレスに場所を設定します。

ステートメントはfixedオブジェクトを「固定」し、GC がオブジェクトを移動できないようにします。

そのコンテキストで使用される「&」は、Bitwise And ではなく、「Address Of」演算子です。

更新された質問への回答:

やってみました:

fixed (void* voidRef3 = &_someMember) 
{ 
... 
}
于 2010-05-16T07:08:36.130 に答える
0

最後のコメントへの返信: これはうまくいきますか?

fixed (IntPtr* ptrRef3 = (IntPtr *) &_someMember)

編集

私はあなたが何を意味するのか分かりません

それは事実上リフレクターが私に与えたものです

あなたが言及したエラーは非常に明確なようです:あなたが尋ねれば、明示的に (void *) から (IntPtr *) に変換できます。私の例は尋ねますが、あなたの例はそうではありません。

を挿入すると、本当に同じエラー メッセージが表示されます(IntPtr *)か?

別の編集

誰かがそれを確認できますか

fixed (void* ptrRef3 = &_someMember)

と同等です

fixed (IntPtr* ptrRef3 = &_someMember)

まず第一に、はい、それらは同等です。

第二に、私はこれが何を意味するのか考えてきました。逆コンパイラは、_someMember への移動可能な参照を作成するのに十分な知識がないため、C# ランタイムに管理を委ねることはできないと考えていると思います。これに対処するために、fixedそのメモリのガベージ コレクションを無効にして、安全に解放できるタイミングをランタイムに伝えるようにしています。

したがって、これは手元に置いておくべきコードではありません。そのデータのビットの本当の意味と寿命を理解したらすぐに、通常の (ガベージ コレクションされた) 変数を使用するように書き直してください。

于 2010-05-16T09:28:43.327 に答える