You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# Action调用异常:Target正确但调试时this指向错误

问题解答

核心原因

这是Visual Studio调试器的显示异常,而非代码逻辑或委托绑定的问题。实际运行时doStuff方法中的this依然指向正确的MyClass实例(这也是功能正常的原因),只是调试器在展示上下文时出现了错位。

常见触发场景:

  • 当委托绑定的是私有实例方法时,调试器可能错误地将调用栈上层的Updater实例当成当前方法的this上下文
  • JIT编译优化(比如Release模式下的优化,甚至Debug模式下的部分隐性优化)可能导致调试符号信息不完整,进一步加剧这个显示问题

验证方式

你可以在doStuff方法中添加一行代码,确认运行时的实际this指向:

private void doStuff(float deltaTime)
{
    // 调试时查看输出窗口,验证实际上下文
    Console.WriteLine($"实际this类型:{this.GetType().Name},InstanceId:{_instanceId}");
    // 原业务逻辑:处理_someValue
}

运行后输出窗口会显示正确的MyClass类型和对应的_instanceId值,证明运行时上下文完全正确。

临时解决办法

  1. 禁用JIT优化:
    右键项目 → 属性 → 生成 → 取消勾选“优化代码”(Debug模式默认关闭,但部分场景可能被意外开启)
  2. 显式捕获实例上下文:
    注册委托时用lambda显式捕获当前实例,强制调试器识别正确的上下文:
    public void Method()
    {
        var self = this;
        Updater.Instance.RegisterUpdate(_instanceId, deltaTime => self.doStuff(deltaTime));
    }
    
  3. 强制在Immediate窗口访问字段:
    即使Locals窗口显示错误,你可以在Immediate窗口中通过委托Target直接访问字段(需回到Updater.Update的调用栈帧):
    ((MyClass)updateAction.Target)._someValue
    

内容的提问来源于stack exchange,提问作者Rabadash8820

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:46:18