我在一个方法中有以下代码:
string username = (string)context["UserName"];
string un = (string)context["UserName"];
问题是第一个字符串"username"没有分配,而第二个字符串分配。
更奇怪的是,当我在第一行之后停止调试,并将该行复制到即时窗口,删除可变类型延迟时,它被成功地分配了。
我已经重建了所有并检查了项目属性,这似乎是可以的。
context
变量是一个System.Configuration.SettingsContext
,它是一个哈希表。更具体地说,我正在实现一个配置文件提供程序GetPropertyValues
方法。
我使用的是VS 2012和.NET 4.5
编辑:
我在我的项目中使用代码契约,它使用编译时代码注入进行运行时检查。我禁用了它,一切都很好。我会尝试逐个删除合同,找出是哪一个造成了问题。
您所看到的与我之前看到的代码契约错误类似。几个月前,我在这里写了一些关于它的文章。如果您有这个错误,那么您的方法中可能也有一个使用username
的lambda或LINQ表达式。
为了将来参考,这是我看到的错误:
在相同的方法中,我有一个lambda表达式捕获一个局部变量,比如
values
,还有一个Contract.Requires()表达式检查一些完全无关的东西。在调试该方法时,调试器在Locals中显示变量values
两次,并报告values
的值始终为null,即使情况显然不是这样。复制:
static void Reproduction(string argument) { Contract.Requires(argument != null); // <-- (1) int[] values = new int[1]; Debug.Assert(values != null); Func<int, bool> d = i => values[i] >= 0; // <-- (2) Console.WriteLine(values); }
在分配给
values
之后,在此方法中的某个位置放置断点,并确保调用该方法。当调试器遇到断点时,请查看Visual Studio的Locals列表中的重复变量。将鼠标悬停在values
上,发现它被报告为null
,但事实显然并非如此。当删除合约(1)或带有lambda(2)的行时,问题就消失了。
在调查和取消合同后,我发现只有当启用运行时合同检查并且出现此合同时,问题才会出现:
Contract.Ensures(Contract.Result<System.Configuration.SettingsPropertyValueCollection>() != null);
如果我删除这一行,代码就会工作,所以它看起来像是代码契约错误,尽管我无法在测试项目中重新创建它。