编辑:这里有一个类似的问题,但解决方案只是提供了一些变通方法,并没有深入探讨问题的原因或如何解决。这个问题可能仍然是重复的。
编辑2:事实证明,这个问题仅在调试期间发生,尽管之前没有发生。将(TCheck)null
替换为null as TCheck
后,测试在运行时通过,但在调试时会抛出异常。
原始帖子:我在单元测试中有一个方法,看起来像这样
internal void EqualityAssert<TCheck, TEquatable>(TEquatable item, ... )
where TCheck : class, IEquatable<TEquatable>, TEquatable
{
// Various equality assertions that are passing
// ...
// A == null
Assert.Throws<NullReferenceException>(
() => ((IEquatable<TEquatable>)item).Equals((TCheck)null));
}
该方法被各种单元测试调用,每个测试都因为在预期位置遇到 "Unhandled NullReferenceException" 错误而失败。
之前 Assert.Throws 对我来说是正常工作的,但我一直没有找出是什么改变导致了它的破裂。
((IEquatable<TEquatable>)item).Equals((TCheck)null)
的值分配给一个临时变量是否可以防止JITter优化掉它?在你的尝试中,你最终会调用Object.Equals(Object)
而不是IEquatable
的方法吗?请确保尽可能向我们展示你的实际代码... - Ruben Bartelink