如果没有成员访问权限,如何发生NullReferenceException?

时间:2015-09-25 13:55:05

标签: c# .net exception nullreferenceexception

修改

  • 这个问题不是:什么是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,它将如何导致此问题(请记住:stacktrace指向THIS方法/属性!)

1 个答案:

答案 0 :(得分:2)

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

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

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