我有一个方法可以接受ref T*
,我需要将其重新解释为ref nint
.通常情况下,我会使用ref Unsafe.As<T*, nint>(ref value)
,但在这种情况下,它不会编译,因为"类型‘T*’可能不会用作类型参数".
如何将我的ref T*
重新解释为ref nint
?
我有一个方法可以接受ref T*
,我需要将其重新解释为ref nint
.通常情况下,我会使用ref Unsafe.As<T*, nint>(ref value)
,但在这种情况下,它不会编译,因为"类型‘T*’可能不会用作类型参数".
如何将我的ref T*
重新解释为ref nint
?
这是一个有趣的.
首先,我假设自从指针以来,您已经在代码中使用了unsafe
.
试试这个:
static unsafe nint Exch<T>(ref T* ptr, nint val)
{
fixed (void* p = &ptr)
{
return Interlocked.Exchange(ref Unsafe.AsRef<nint>(p), val);
}
}
它没有@shingo的回答那么直接或高效,但它似乎正确地处理了交流.
我会给你发一把小提琴,但dotnetfiddle不喜欢unsafe
代码.这就是我测试的内容:
class Foo
{
public int Value { get; set; }
}
unsafe void Main()
{
Foo v1 = new() { Value = 12345 };
Foo* ptr = null;
Console.WriteLine($"Initial: {(nint)((void*)ptr):X}");
Console.WriteLine();
nint res1 = Exch(ref ptr, (nint)(&v1));
Console.WriteLine($"First: {res1:X} -> {(nint)((void*)ptr):X}");
Console.WriteLine();
nint res2 = Exch(ref ptr, 0);
Console.WriteLine($"Second: {res2:X} -> {(nint)((void*)ptr):X}");
}
输出:
Initial: 0
First: 0 -> 4920AFCE78
Second: 4920AFCE78 -> 0