这是我见过的最古怪的虫子

本文关键字: | 更新日期: 2023-09-27 18:06:25

我有一个我无法解释的情况。看看下面的代码,注意变量cd是如何定义的,它们的值是奇怪的。c等于null,但d不等于。当然这是不可能的(对吧?)鉴于以下事情我是100%确定的:

  • 。value是一个字段,而不是属性
  • 类型限定符是一个密封引用类型,带有基类型对象
  • 应用程序是单线程的。
  • 我已经完成了"Clean Solution"。

现在最奇怪的事情是,当我停止调试运行时,用d替换lambda表达式中的变量引用c,然后构建并再次运行,dnull but c '不是!

private static object CreateConstraints(CompositeElement constraintsElement)
{
    Contract.Requires(constraintsElement != null);
    var constraintTypes = from e in constraintsElement where e.DefinitionName.IsAnyOf("ConstraintType", "ConstraintTypeNamePrependedWithComma") select (Qualifier)e.Value;
    var declarer = (MemberDeclaration)constraintsElement.Parent.Value;
    GenericTypeParameterCollection genericTypeParameters = declarer.Name.Suffixes.OfType<GenericTypeParameterCollection>().First();
    Element a = constraintsElement["TypeName"];
    a.SetValue();
    var c = a.value as Qualifier;
    var d = a.value as Qualifier;
    genericTypeParameters.First(gp => gp.Type == c).Constraints.AddRange(constraintTypes);
    return null;
}

我也做了拆解的截图都是这样。就我个人而言,我不确定他们是否正确。

所以我想问一下,我是否错过了一些可以使这种行为完全正常的东西,或者这里真的有什么奇怪的事情发生?

这是我见过的最古怪的虫子

你可以说我傻,但我真的不觉得有什么问题。

    从描述中,没有"bug"。(或者你的程序逻辑出错了?)
  • 我们所拥有的是一个变量c在调试器窗口中出现两次。
  • c的一个实例具有正确的类型(并且我假设有正确的值)。
  • 另一个为空。这必须是捕获的 c的视图,因为lambda没有执行它,所以它是null

那么应该是什么问题呢?

你可以试着在lambda里面放一个断点。

查看编辑前的调试器屏幕截图,我注意到本地"c"列出了两次,一次值为null,一次值作为限定符的实例。这看起来很奇怪,让我怀疑c#编译lambda表达式时出现了错误。作为一种变通方法,请尝试使用显式委托。

同样,在lambda表达式中的双等号上也有一个错误。将鼠标悬停在它上面以获得错误消息,这可以提供关于正在发生什么的线索。

可能在调用堆栈的深处抛出了一个异常,并且异常处理的方式阻止了赋值的正确完成。

相关文章:
  • 没有找到相关文章