我正在对两个对象的不同实例之间的某些事物进行一些比较。由于这些比较是连续的(如果比较 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 在其他线程或某种匿名方法中执行,我是否应该能够调试内部方法?
截至发帖时,还不是真正的答案,但它可能是一个线索:
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” - 似乎完全卡住了