我今天刚开始使用新的 Windows 7 x64 机器,在调试过程中体验了一些新的东西。我有可以被认为如下的代码:
if(/*Some criteria that evaluates to false*/)
{
int weekNum = (int)DateTime.Now.Subtract(_myObject.StartDate).TotalDays/7;
//Do something with weekNum
}
我想通过 if 块中的代码进行调试。在我目前的情况下,将下一条语句设置为块内的第一行比使我的数据符合条件要容易得多,因此我将下一个执行行设置为 int weekNum ... 这给出了一个空引用异常,因为它,显然,没有实例化 weekNum。我已经验证右侧表达式中没有任何内容为空,并且可以通过将右侧复制并粘贴到监视或即时窗口中来成功获得结果。如果我从字面上用 if(true) 替换它,它就可以正常工作。在这样的场景中选择下一个执行语句对我来说是一种非常常规的调试方式。为什么会这样?
编辑:我已经验证当前的构建配置没有优化。
编辑:我无法在另一个测试项目中重现它。我修改了原始代码以从方程式中删除我的对象,这是在原始项目中获得异常的新完整代码:
private void SelectDefaultLearningUnit()
{
TODLogic.LearningUnit currentLu = null;
//If sce is active get the learning unit for the current week.
if (!_sce.IsCancelled && !_sce.IsCancelled
&& _sce.StartDate <= DateTime.Now
&& _sce.EndDate > DateTime.Now)
{
//Get number of weeks since semester started
int currentWeek = (int)4; //THIS LINE STILL BLOWS UP
//Find the first learning unit for the current week
currentLu = _LearningUnits.Where(lu => lu.StartWeek <= currentWeek && lu.EndWeek >= currentWeek).FirstOrDefault(); //May be null
}
if (currentLu == null)
currentLu = _LearningUnits.FirstOrDefault();
cbLearningUnit.SelectedItem = currentLu;
}
同样,只有当我在 if 块内手动设置执行时才会出现异常,否则它会被跳过。我看到的唯一区别是,如果我在测试项目中对变量进行监视,它会说 currentWeek 的值是 0,直到它到达该行然后它被分配。在它爆炸的项目中,它在当前周的左侧显示一个红色的感叹号,并且值表示''为空。我希望它要么说值为 0,要么说“currentWeek”未定义!这就是为什么我最初认为它认为 currentWeek 是“未实例化”的,即不存在。