【问题标题】:How can I get Visual Studio 2017 to interactively debug this line?如何让 Visual Studio 2017 以交互方式调试此行?
【发布时间】:2018-04-12 09:37:04
【问题描述】:

我将以下代码设置为一个虚拟示例,以说明我在生产代码中发现的内容。

static void Main(string[] args)
{
    bool GreaterThan(int x, int y)
    {
        return x > y;
    }

    bool OperateOnTwoNumbers(int x, int y, Func<int, int, bool> func)
    {
        return func(x, y);
    }

    var twoGreaterThanOne = OperateOnTwoNumbers(2, 1, GreaterThan);

}

当我在OperateOnTwoNumbers(2, 1, GreaterThan) 上设置手表或使用 Shift+F9 进行交互调试时,出现以下错误。

OperateOnTwoNumbers(2, 1, GreaterThan) 错误 CS0103:当前上下文中不存在名称“OperateOnTwoNumbers”

但代码本身运行良好,在我越线后,我可以看到分配给变量的值。

这已经在不止一台计算机上复制了,带有生产代码和这个虚拟示例,所以我认为这不是环境问题。

这是问题的记录,可以通过单击记录并在其直接地址查看以完整质量查看。

有什么想法吗?

【问题讨论】:

  • 这看起来很奇怪。您是否进行了清洁/重建?你有循环引用吗?
  • 这个特殊的例子是在一个全新的项目上,我只是为了测试这个概念而创建的,你看到的是整个代码库,没有其他参考。我尝试重建无济于事。
  • 您是否进行了发布或调试构建?该方法可能已被优化?
  • 在这两个地方我都目睹了这是在调试配置中。
  • 我不怀疑您在这里看到了问题,但在我的两个测试中(本地测试和here)似乎都很好。你分析过生成的 IL 吗?

标签: c# visual-studio debugging


【解决方案1】:

我怀疑 watch 表达式评估器尚未更新以处理本地函数(或者,如果它在 VS 的某些版本中有效而在其他版本中无效 - 尚未在您的特定版本中更新)。

本地函数(如GreaterThanOperateOnTwoNumbers)只是语法糖,并真正编译成具有神秘名称的静态函数:

[CompilerGenerated]
internal static bool <Main>g__OperateOnTwoNumbers|0_1(int x, int y, Func<int, int, bool> func)
{
  return func(x, y);
}

然后给他们打电话:

Program.<Main>g__OperateOnTwoNumbers|0_1(...);

所以 watch 表达式评估器应该意识到这一点,但它没有并尝试使用 OperateOnTwoNumbers 名称调用函数(正如您从编译器错误消息中看到的那样“当前上下文中不存在名称 'OperateOnTwoNumbers'”) ,而且真的没有这个功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 2019-08-05
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多