没有成员访问时怎么会出现 NullReferenceException?

How can a NullReferenceException occur when there is no member access?

编辑

编辑结束

据我所知,只有在访问引用类型的成员时才会出现NullReferenceException。据我所知, "references" thisbase 永远不能为空。

今天我遇到了一个 属性,它抛出一个 NullReferenceException,但没有成员访问权限(thisbase 的成员除外)。

我的问题是:如何!

这是代码:

public class ComponentObject : Base
{
    private readonly XmlNamespaceManager _nsmgr;    
    public XmlNode FieldGroupContainerWerknemers { get { ... } }

    public string NumberOfMngDirectorMainShareholders
    {
        get
        {
            XmlNode fieldGroupContainerWerknemers = this.FieldGroupContainerWerknemers;
            return base.GetValue(fieldGroupContainerWerknemers, this._nsmgr, "./ns1:FieldGroup//ns1:DynamicFields//ns1:Field[@Name='DgaAantal']//ns1:Value");
        }
    }
}

这是个例外:

Exception type: NullReferenceException
Source: Turien.Interfaces.BizTalk.Policy.Helpers
Target Site: System.String get_NumberOfMngDirectorMainShareholders()
The following is a stack trace that identifies the location where the exception occured

    at Turien.Interfaces.BizTalk.Policy.Helpers.BatchCertigo.ComponentObject.get_NumberOfMngDirectorMainShareholders()
    at Turien.Interfaces.BizTalk.Policy.Helpers.BatchTurien.BatchE.BatchE.CreateCurrentCoverageData()
    at Turien.Interfaces.BizTalk.Policy.Helpers.BatchTurien.BatchE.BatchE.CreateLetterDataBatchE()
    at Turien.Interfaces.BizTalk.Policy.Helpers.BatchTurien.BatchE.BatchE.CreateContract()
    at Turien.Interfaces.BizTalk.Policy.Helpers.BatchTurien.BatchE.BatchE.CreateBatch(XmlDocument outputdata)
    at Turien.Interfaces.BizTalk.Policy.Helpers.BatchTurien.BatchBase`1.CreateBatch(XmlDocument outputdata, String fileName, Int32 outputNumber)

我采取的步骤:

编辑

对于那些告诉我要调试的人:我很乐意。提出将我的断点放在哪里以及要检查哪些变量的建议。还有更多:如何处理这些信息。例如:如果 this.FieldGroupContainerWerknemers 为 null,那将如何导致这种情况。或者如果 _nsmgr 为 null,它会如何导致此问题(请记住:堆栈跟踪指向此方法/属性!)

JIT 编译器可以在发布版本中内联方法调用(启用优化)。

在您的示例中,get_FieldGroupContainerWerknemers()base.GetValue 可能已被内联。在这种情况下,这些方法中的 NullReferenceException 将使堆栈跟踪指向 get_NumberOfMngDirectorMainShareholders().

内联发生在 JIT 编译期间,因此您不会在 IL 代码中看到它。