我有一个方法可以接受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

Csharp相关问答推荐

我正在制作一个Unity游戏,如果对这个玩家控制器进行编码,但当它 skip 时,它会删除我的速度

C#类主构造函数中的调试参数

System. InvalidOperationException:无法将数据库中的字符串值i转换为映射的ItemType枚举中的任何值''''

在C#中使用类中的对象值

Azure Redis缓存与Entra ID身份验证

静态对象构造顺序

C#-VS2022:全局使用和保存时的代码清理

反序列化私有成员

使用带有参数和曲面的注入失败(&Q;)

在try 使用访问服务器上的文件夹时,如何解决CORS错误.NET核心API

在字符串C#之前获取数字

在ASP.NET Core 8 MVC中本地化共享视图

在C#中,当输入一个方法/局部函数时,我的IEnumerator被重置/重新创建.为什么?

ReadOnlyMemory访问基础索引的替代方案

我可以强制System.Text.Json.JsonSerializer以非递归方式工作吗?

数据库操作预计影响1行,但实际影响0行; after _dbContext.SaveChanges();

DropDownListFor未显示选定值

从MudAutoComplete打开对话框,列表仍然可见

获取应用程序版本信息时出现奇怪信息

通过mini kube中的远程调试Pod与从emoteProcessPickerScript中解析错误输出的代码错误进行比较