我有以下代码:
internal class FakeInvitationsRepository : InvitationsRepository
{
internal readonly static Dictionary<Guid, InvitationDbEntity> Data = new Dictionary<Guid, InvitationDbEntity>()
{
{ ...
Run Code Online (Sandbox Code Playgroud)
这是一个屏幕截图,它的价值:

这只是一些内存中的假数据,总共 3 项。该类位于 ASP.NET WebAPI 项目中,暂时不在测试 DLL 中,而是在 WebAPI DLL 中。
一个 API 调用进来并在控制器操作中遇到一个断点,它试图直接使用这些假数据,还没有 IoC 或任何聪明的东西。
但该字段Data为空。它在运行时导致空引用异常。

C# 语言规范说:
如果类中存在静态构造函数(第 10.11 节),则在执行该静态构造函数之前立即执行静态字段初始值设定项。否则,在第一次使用该类的静态字段之前的依赖于实现的时间执行静态字段初始值设定项。
这里发生了什么使得该字段在第一次使用之前没有初始化?
注意:一位同事很快检查了理智,也很困惑。Data只设置过,永远不会被我的代码清零(毕竟它是只读的)。
编辑
这是我的代码的调用堆栈:
System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
{ at Company.Product.WebAPI.Controllers.RenamedController.<GetInvitations>d__14.MoveNext()
at Company.Product.WebAPI.Controllers.RenamedController.GetInvitations(Guid id)
at lambda_method(Closure , Object , Object[] )
at Company.WebAPI.Product.Areas.RouteDebugger.InspectActionInvoker.InvokeActionAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
at Company.WebAPI.Product.Areas.RouteDebugger.InspectHandler.<>n__FabricatedMethod12(HttpRequestMessage , CancellationToken )
at Company.WebAPI.Product.Areas.RouteDebugger.InspectHandler.<SendAsync>d__e.MoveNext()
at Company.WebAPI.Product.Areas.RouteDebugger.InspectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
}
FrameCount: 84
frames: {System.Diagnostics.StackFrame[87]}
m_iMethodsToSkip: 3
m_iNumOfFrames: 84
Run Code Online (Sandbox Code Playgroud)
我无法回答,因为问题被搁置了。值得商榷。
感谢 MStodd。答案是愚蠢而直接的,但有点令人惊讶;我不记得在 11 年的 .NET 编程中见过这种情况。
该Data字段尚未初始化。
在初始化程序中放置一个断点,整个块变为红色,表明它在下一步被调用。
这NullReferenceException是一个红鲱鱼,由于为this.Invitations空。
当然,我希望该字段在该行停止时初始化,我只是没想到它发生得这么晚,因此假设这null是导致我的运行时异常。
你去吧。
从您的调用堆栈中,我可以推断出 Invitations 属性已被评估(在 Select 主体中)。作为调用堆栈上的最后一个,我可以推断出空引用是由于邀请为 NULL 这一事实而引发的!)。我认为 Data = NULL 与调用堆栈根本无关!而是一个调试器问题。