字符串分配神秘问题.变量名称会影响行为



我在一个方法中有以下代码:

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);

如果我删除这一行,代码就会工作,所以它看起来像是代码契约错误,尽管我无法在测试项目中重新创建它。

相关内容

  • 没有找到相关文章