【问题标题】:String assignment mystic issue. Variable name affects behavior字符串分配神秘问题。变量名影响行为
【发布时间】:2012-07-31 18:26:43
【问题描述】:

我在方法中有以下代码:

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

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

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

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

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

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

我正在使用 VS 2012 和 .NET 4.5

编辑:

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

【问题讨论】:

  • 不可能是变量名。你试过交换作业的顺序吗?
  • 您确定没有在范围内的其他地方定义另一个 username 变量吗?
  • @Douglas 不仅如此。我也尝试过为一个对象和之后的字符串赋值,但没有运气。
  • 提供上下文(类、方法、主要库)。现在甚至不清楚这些是本地变量还是字段。
  • 对于想知道的人:这确实是代码合同中的一个错误,我在下面复制了它。

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


【解决方案1】:

您所看到的类似于我之前看到的代码合同错误。我写了一些关于它的东西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) 的行时,问题就消失了。

【讨论】:

  • 是的,就是这样。我在 linq 表达式中使用了这个变量。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-04-17
    • 2023-03-07
    • 2011-10-05
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    相关资源
    最近更新 更多