0

我在方法中有以下代码:

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

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

问题是第一个字符串“用户名”没有被分配,而第二个被分配了。

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

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

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

我正在使用 VS 2012 和 .NET 4.5

编辑:

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

4

2 回答 2

0

在调查和禁用合约后,我发现只有在启用运行时合约检查并且出现此合约时才会出现问题:

Contract.Ensures(Contract.Result<System.Configuration.SettingsPropertyValueCollection>() != null);

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

于 2012-07-31T20:25:20.417 回答
0

您所看到的类似于我之前看到的代码合同错误。几个月前我在这里写了一些关于它的东西。如果你有这个错误,你的方法中可能还有一个 lambda 或 LINQ 表达式,它使用username.

为了将来参考,这是我看到的错误:

我用同样的方法有一个捕获局部变量的 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上面,发现它被报告为nullis ,这显然不是这种情况。

删除合同 (1) 或带有 lambda (2) 的行时,问题就消失了。

于 2012-08-01T21:15:54.457 回答