【发布时间】:2019-12-03 18:51:09
【问题描述】:
我在 C# 项目(目标 .Net Framework 4.7.2)的调试版本中受到奇怪行为的困扰。
- 以下代码返回 false。
var wHasOvernightShifts = this.ScheduleSegments.Any(
x => x.SegmentTypeId == eSegmentType.Schedule
&& !x.IsDeleted
&& x.ShiftDate == pShiftDate
&& x.StartTime.Value.DayOfWeek != x.FinishTime.Value.DayOfWeek);
我知道这是错误的答案。当我在 Quick Watch 中评估 RHS(在同一点使用相同的数据)时,相同的代码返回 true。退回调试器并重新执行该语句再次返回 false。 (注意,所有引用的属性都没有副作用)。
- 我还有一个方法似乎可以执行但返回 null。永远不会触发方法内的断点。尝试进入该函数将被忽略。断点表示它不会被触发,因为模块尚未加载。但是,在源代码中高出几行,来自同一模块的函数运行正常(w.r.t. 调试和预期函数)。
如果我执行清理并重建,那么一切都会按预期运行。请注意,仅靠重建是不够的。
在第 2 种情况下,在清理/重建之后,该方法返回一个非空集合,并且其中的断点起作用,就像 step-into 一样。
好像编译器的增量部分坏了,或者执行环境刚刚忘记加载了模块。
有没有其他人遇到过类似的问题?有没有简单的解决方案(除了清理/重建)?
n.b.我已关闭“仅启用我的代码”并打开“要求源文件与原始版本完全匹配”以尝试解决此问题 - 不走运。
【问题讨论】:
-
只有当您故意将调试器退回以再次枚举
ScheduleSegments时才会发生这种情况吗? -
您是否在任何相关类中覆盖了
ToString?您的调试器将调用ToString(默认情况下)来格式化显示值,而您的实际代码不会这样做。 -
什么是
this.ScheduleSegments?是列表还是查询?由于延迟执行,在调试器中检查 Linq 语句非常棘手。 -
1. ScheduleSegments 是一个 Observable 集合。
-
2.我所有的类都使用 ToString() 以便我可以在调试模式下查看它们。
标签: c# visual-studio debugging