这是我见过的最古怪的虫子
本文关键字: | 更新日期: 2023-09-27 18:06:25
我有一个我无法解释的情况。看看下面的代码,注意变量c
和d
是如何定义的,它们的值是奇怪的。c
等于null
,但d
不等于。当然这是不可能的(对吧?)鉴于以下事情我是100%确定的:
- 。value是一个字段,而不是属性
- 类型限定符是一个密封引用类型,带有基类型对象
- 应用程序是单线程的。
- 我已经完成了"Clean Solution"。
现在最奇怪的事情是,当我停止调试运行时,用d
替换lambda表达式中的变量引用c
,然后构建并再次运行,d
是null 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表达式中的双等号上也有一个错误。将鼠标悬停在它上面以获得错误消息,这可以提供关于正在发生什么的线索。
可能在调用堆栈的深处抛出了一个异常,并且异常处理的方式阻止了赋值的正确完成。