相談させてください。
IntPtr を ref int に変換するために以下のようなコードを書くと、期待通り False と表示されます。
IntPtr ptr = Marshal.AllocCoTaskMem(4);
ref int x = ref Unsafe.AddByteOffset(ref Unsafe.NullRef<int>(), ptr);
Console.WriteLine(Unsafe.IsNullRef(ref x)); // False と表示される
Marshal.FreeCoTaskMem(ptr);
しかし、以下のように意味のない for 文を追加すると、コードの最適化が有効な場合のみ True と表示されます。
for (int i = 0; i < 0; i++) { } // 意味のない for 文
IntPtr ptr = Marshal.AllocCoTaskMem(4);
ref int x = ref Unsafe.AddByteOffset(ref Unsafe.NullRef<int>(), ptr);
Console.WriteLine(Unsafe.IsNullRef(ref x)); // 最適化が有効な場合のみ True と表示される
Marshal.FreeCoTaskMem(ptr);
ただし、意味のない for 文があっても
Unsafe.AddByteOffset(ref Unsafe.NullRef<int>(), ptr)
→ Unsafe.SubtractByteOffset(ref Unsafe.NullRef<int>(), -(nint)ptr)
のように書き換えると常に False と表示されるようになります。
なぜこのようなことが起こるのかさっぱり見当がつかないので、お知恵を拝借できないでしょうか。
私の環境を分かる範囲で書くと以下のとおりですが、他に何か必要な情報があればお教えください。
Windows 10 Pro (21H2)
Microsoft Visual Studio Community 2022 (64 ビット) Version 17.1.1
コンソール アプリケーション、.NET 6.0
どうぞよろしくお願いいたします。
C#, C♯, C#相談室 Part96
■ このスレッドは過去ログ倉庫に格納されています
137デフォルトの名無しさん (ワッチョイ a236-8qwV)
2022/03/15(火) 17:49:18.74ID:uT8cdwkS0■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 日本小型車「かわいい」 トランプ氏、生産承認指示 [どどん★]
- 【サッカー】日本が2046年W杯の開催地に立候補 宮本会長「手を挙げる予定」 他国との共催を視野 8万人収容スタジアム問題も [冬月記者★]
- 【兵庫】「失禁して下着が汚れたので、近くの用水路で洗っていた」歩道で公然わいせつ疑い、自称・布教師の72歳男逮捕 [nita★]
- 【サッカー】日本テレビ 2026年サッカーW杯の地上波中継が決定 グループステージ日本戦1試合 含む 計15試合放送 [阿弥陀ヶ峰★]
- 25年の出生数は最少66.6万人 民間試算、結婚数は横ばい (日本総研) ★2 [少考さん★]
- 農水相肝いりのおこめ券配布、…大阪・交野市長「配らない」宣言、全国自治体も困惑ですでに破綻 [バイト歴50年★]
- 【超速報】山上徹也、陳謝 [519511584]
- 山上徹也「安倍晋三の遺族には謝る 彼らは何の恨みもない 突然家族を失う経験を自分もしており弁解の余地はない」 [175344491]
- 中国、高市首相の日中共同声明から変更はない説明を拒否「立場は変わらないと言ってごまかしている。答弁の撤回を重ねて求める」 [256556981]
- 高市早苗「睡眠時間2時間で頑張ってます」 [834922174]
- 【速報】政権与党への批判、即逮捕へ・・・ [955862909]
- 英国の日本人サッカー選手、日本軍の「小野田寛郎」が描かれたプレートを掲げて大炎上。日本の右傾化止まらない [165981677]
