在没有成员访问权限的情况下,NullReferenceException怎么会发生

本文关键字:情况下 NullReferenceException 怎么会 权限 成员 访问 访问权 | 更新日期: 2023-09-27 18:14:29

EDIT

  • 这个问题不是:什么是NullReferenceException?当访问为null的引用的成员时,会发生NullReferenceException
  • 这个问题是:当没有成员访问权限时,NullReferenceException怎么会发生

结束编辑

据我所知,NullReferenceException只能在访问引用类型的成员时发生。据我所知,"引用"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)

我采取的步骤:

  • 我搜索了另一处房产NumberOfMngDirectorMainShareholders:这是唯一的一处
  • 我使用ILSpy来监视DLL内部。生产中的代码与源代码管理中的代码相同

编辑

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

在没有成员访问权限的情况下,NullReferenceException怎么会发生

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

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

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