我在方法中有以下代码:
string username = (string)context["UserName"];
string un = (string)context["UserName"];
问题是没有分配第一个字符串“username”,而第二个字符串没有分配。
更奇怪的是,当我在第一行之后停止调试并将该行复制到立即窗口时,删除了变量类型的delaration,它已成功分配。
我已经重建了所有并检查了项目属性,这似乎没问题。
context
变量是System.Configuration.SettingsContext
,它是一个哈希表。更具体地说,我正在实施一个配置文件提供程序GetPropertyValues
方法。
我正在使用VS 2012和.NET 4.5
修改
我在我的项目中使用代码契约,它使用编译时代码注入进行运行时检查。我禁用了它,一切运作良好。我将尝试逐个删除合同,以找出导致问题的合同。
答案 0 :(得分:0)
在调查和解除合同之后,我发现只有在启用运行时合同检查并且出现此合同时才会出现问题:
Contract.Ensures(Contract.Result<System.Configuration.SettingsPropertyValueCollection>() != null);
如果我删除这一行,代码就可以工作,所以看起来代码合同有bug,尽管我无法在测试项目中重新创建它。
答案 1 :(得分:0)
您看到的内容类似于我之前看到的Code Contracts错误。我写了一些关于它的事情here a few months back。如果您有此错误,您的方法中可能还有一个使用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)的行时问题消失。