在静态比较器类中调试函数

问题描述 投票:0回答:1

我正在对两个对象的不同实例之间的某些事物进行一些比较。由于这些比较是连续的(如果比较 A == 0,我们就去比较 B,如果比较 B == 0,我们就去比较 C,依此类推,直到我们返回 -1 或 1),我不想为了放置很多如果,我想过这样做:

public static class TStatsComparer
{
    public static int Compare(TStats? t1, TStats? other)
    {
        Func<TStats, TStats, int>[] comparisonRules = new Func<TStats, TStats, int>[]
            {
                (t1, t2) => CompareA(t1, t2),
                (t1, t2) => CompareB(t1, t2),
                (t1, t2) => CompareC(t1, t2),
                (t1, t2) => CompareD(t1, t2),
                (t1, t2) => CompareE(t1, t2),
            };

        int result = comparisonRules.Select(method => method(t1, other))
                            .FirstOrDefault(result => result != 0);

        return result;
}

其中

CompareA
(或B,或C...)是类似

的方法
static int CompareA(TStats? t1, TStats? other)
{
    int result = 0;
    // ...
    // We do the comparison and store it in result
    // result values could be 0,1 or -1

    return result;
}

和比较班级

public class TStats : IComparable<TStats>
{
    //...

    public int CompareTo(TStats? other)
    {
        return TStatsComparer.Compare(this, other);
    }
}

所以它得到第一个返回不同于 0 的值的比较并返回它。它按预期工作,但问题是我无法从 Visual Studio 调试它。例如,如果我在

CompareA
方法中放置一个断点,它会说

您的应用程序已进入中断状态,但当前没有执行所选调试引擎支持的代码(例如,仅执行本机运行时代码)

虽然它仍然有效,但就是这样,我无法调试它。

如果我删除

Func<>
东西并直接按顺序调用
CompareA/B/C
方法,我可以正常调试它。

我使用这样的比较器是否犯了一个大错误?

即使 func 在其他线程或某种匿名方法中执行,我是否应该能够调试内部方法?

c# .net-core func
1个回答
0
投票

截至发帖时,还不是真正的答案,但它可能是一个线索:

2021 年 11 月,GitHub 上报告了一个看起来非常相似的问题:
调试器无法在给定情况下使用 Linq #62232 进入函数

问题报告者声称,使用 .NET 6 时,Windows 10 上的 VS Code 和 Visual Studio (2022) 中会出现该问题;而对于 .NET 5 和 .NET Framework 4.8,不会出现此问题。

截至 2023 年 9 月,该问题仍未解决。


提供用于娱乐的代码片段是:

static void Main(string[] args)
{
    var list = new[] { "1", "4", "h", "l1", "7" };
    var parsedList = list.Select(item => DoSomething(item)).Where(item => item == 1).ToList();
}

public static int DoSomething<T>(T input)
{
    return 1;
}

连同以下评论:

只需在 DoSomething 中放置一个断点并运行即可。

VS 进入中断模式:(“您的应用程序已进入中断状态,但当前没有执行所选调试引擎支持的代码(例如,仅本机运行时代码正在执行)。”)- 单步执行似乎仍然有效,没有显示其他错误

VS Code:调用堆栈显示:“处理 stackTrace 请求时出错。未知错误 0x80131c49” - 似乎完全卡住了

© www.soinside.com 2019 - 2024. All rights reserved.