Closed ufcpp closed 1 year ago
取れてるのはローカル変数のスタック上のアドレスっぽい。
using System.Runtime.CompilerServices;
unsafe
{
string s = "abcd";
object o = s;
int i = 1;
// 参照型変数への & は、ローカル変数の格納場所のアドレスっぽい。
Console.WriteLine($"{(nint)(&o)} {(nint)(&i)}"); // &o は &i と並んでる
// managed pointer 取りたいときはこう。
var p1 = Unsafe.As<object, nint>(ref o);
var p2 = (nint)Unsafe.AsPointer(ref Unsafe.AsRef(in s.GetPinnableReference()));
Console.WriteLine($"{p1} {p2}");
Console.WriteLine($"{p2 - p1}");
}
いつの間にか… https://github.com/ufcpp/UfcppSample/issues/413#issuecomment-1312482243
https://twitter.com/ufcpp/status/1591427452932624386 roslyn/pull/64064 csharplang/pull/6453 で確かに…
「ref safety エラーの類を unsafe コンテキストでは警告だけにしよう」(csharplang/issues/6476)の話の一環っぽい感じではあるんだけど詳細不明。追えてない。