字符串赋值神秘问题。变量名称会影响行为

时间:2012-07-31 18:26:44

标签: c# .net variable-assignment code-contracts

我在方法中有以下代码:

string username = (string)context["UserName"];

string un = (string)context["UserName"];

问题是没有分配第一个字符串“username”,而第二个字符串没有分配。

更奇怪的是,当我在第一行之后停止调试并将该行复制到立即窗口时,删除了变量类型的delaration,它已成功分配。

我已经重建了所有并检查了项目属性,这似乎没问题。

context变量是System.Configuration.SettingsContext,它是一个哈希表。更具体地说,我正在实施一个配置文件提供程序GetPropertyValues方法。

我正在使用VS 2012和.NET 4.5

修改

我在我的项目中使用代码契约,它使用编译时代码注入进行运行时检查。我禁用了它,一切运作良好。我将尝试逐个删除合同,以找出导致问题的合同。

2 个答案:

答案 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)的行时问题消失。