C# 我得到System.NullReferenceException:在运行时尝试向数组添加值时,对象引用未设置为对象的实例

C# 我得到System.NullReferenceException:在运行时尝试向数组添加值时,对象引用未设置为对象的实例,c#,arrays,runtime,int,C#,Arrays,Runtime,Int,我有一段代码: 编辑:参数被初始化为下面添加的行 ProjectionParameters _penParams = new ProjectionParameters(); [Given(@"Rate Rule List $raterule")] public void Rate_Rule_List(Int32 raterule) { _penParams.RateRuleIds.Initialize(); _penParam

我有一段代码:

编辑:参数被初始化为下面添加的行

    ProjectionParameters _penParams = new ProjectionParameters();

    [Given(@"Rate Rule List $raterule")]
    public void Rate_Rule_List(Int32 raterule)
    {

        _penParams.RateRuleIds.Initialize();

        _penParams.RateRuleIds.Add(raterule);

    }
它引用的整数数组定义为:

        private Collection<Int32> rateRuleIds;
    /// <summary>
    /// A collection of rate rule Ids the member has selected. This is only relevant for an AgeServiceOptions Rates Mode.
    /// </summary>
    public Collection<Int32> RateRuleIds
    {
        get { return rateRuleIds; }
    }
发生了两件事:

当我尝试编译时,.Add方法对我不可用,它在以前的实例中可用,但自从我从直接使用DLL切换到调用web服务进行测试后,它就消失了。 如果我尝试访问数组的任何部分及其任何属性,则会得到System.NullReferenceException:对象引用未设置为对象错误的实例。 任何想法都将不胜感激


顺便说一句:我正在使用NBE开发一个简单的语法,允许非技术人员指定要测试的最终用户条件。

您是否曾经这样初始化过您的集合:

rateRuleIds = new Collection<Int32>();

您是否曾经这样初始化您的集合:

rateRuleIds = new Collection<Int32>();
看起来像

 private Collection<Int32> rateRuleIds;
未在任何地方初始化为新集合

编辑:

你说你已经初始化了这个集合。那么_penParams实际上已经初始化了吗

为什么不能调试代码并查看问题所在

在初始化集合的代码上放置一个断点,并确保正在调用它。在落下的行上放置一个断点,并检查变量以查看哪一个为空

 private Collection<Int32> rateRuleIds;
未在任何地方初始化为新集合

编辑:

你说你已经初始化了这个集合。那么_penParams实际上已经初始化了吗

为什么不能调试代码并查看问题所在


在初始化集合的代码上放置一个断点,并确保正在调用它。在落下的行上放置一个断点,并检查变量以查看哪一个为空。

何时实际初始化数组:

rateRuleIds = new Collection<Int32>();

初始化是某种扩展方法吗?因为它不是类的一部分。

您实际何时初始化数组:

rateRuleIds = new Collection<Int32>();
初始化是某种扩展方法吗?因为它不是课堂的一部分

对象的声明告诉编译器此对象存在,这是 规范,并准备好 处理它。初始化,在 另一方面,分配内存用于 物体

对象的声明告诉编译器此对象存在,这是 规范,并准备好 处理它。初始化,在 另一方面,分配内存用于 物体


对集合的引用为null,这通常是由于未能初始化集合造成的。空引用异常表示您正试图访问不存在的实例上的成员。有没有理由不在声明集合的行中初始化集合

根据其他评论,我怀疑您对初始化感到困惑。您声明在ProjectionParameters中初始化this.RateRuleId。在您使用RateRuleId或RateRuleId执行任何操作之前,是否确定正在调用ProjectionParameters?如果是这样的话,您确定该集合以后不会被设置回null吗


我建议,作为一个故障排除步骤,在您提到的行ProjectionParameters中设置一个断点,this.rateRuleIds=new Collection;,还有一个在RateRuleIds.get属性访问器上。然后,我建议运行代码,确保在获取或使用RateRuleId之前,ProjectionParameters已实际执行。如果已执行,请继续单步执行,验证this.rateRuleId的值是否与您期望的值一致,直到遇到NullReferenceException。

对集合的引用为null,通常是由于初始化集合失败造成的。空引用异常表示您正试图访问不存在的实例上的成员。有没有理由不在声明集合的行中初始化集合

根据其他评论,我怀疑您对初始化感到困惑。您声明在ProjectionParameters中初始化this.RateRuleId。在您使用RateRuleId或RateRuleId执行任何操作之前,是否确定正在调用ProjectionParameters?如果是这样的话,您确定该集合以后不会被设置回null吗

我建议,作为一个故障排除步骤,在您提到的行ProjectionParameters中设置一个断点,this.rateRuleIds=new Collection;,还有一个在RateRuleIds.get属性访问器上。然后,我建议运行代码,确保在获取或使用RateRuleId之前,ProjectionParameters已实际执行。如果已执行,请继续单步执行,验证this.rateRuleId的值是否与您期望的值一致,直到遇到NullReferenceEx
异常。

public ProjectionParameters{this.RateRuleId=new Collection;}它在较大的参数集合中初始化。public ProjectionParameters{this.RateRuleId=new Collection;}它在更大的参数集合中初始化。我想Ivor已经提到,他实际上在别处初始化变量…如果粘贴的代码是初始化代码,它不是,事实上,无法初始化集合,因为RateRuleIds属性上没有setter。与pic或not Occess规则等效的SO规则是粘贴代码或您没有编写代码。我认为Ivor已经提到,他实际上正在别处初始化变量……如果粘贴的代码是初始化代码,则实际上不是,无法初始化集合,因为RateRuleIds属性上没有setter。与pic或Not Occess规则等效的是粘贴代码或您没有编写代码。Stacktrace会很有用…Stacktrace会很有用…我必须选择一个答案,Gregs证明在帮助我发现问题方面是最有建设性的。问题有两方面:1。RateRuleID是只读的,开发人员后来将其更改为允许我访问。2.我必须通过在代码开头添加以下行来正确初始化RateRuleId数组:penParams.RateRuleId=new Int32[10]。大小无关紧要,因为可以提供的速率ID数量有限。谢谢你的帮助,非常感谢。Ivor@Ivor:无论如何,拥有RateRuleIds属性的开发人员通常应该负责确保在其公共界面上公开之前正确初始化该属性。很高兴我能帮忙我不得不选择一个答案,格雷格证明了他在帮助我认清这个问题上是最有建设性的。问题有两方面:1。RateRuleID是只读的,开发人员后来将其更改为允许我访问。2.我必须通过在代码开头添加以下行来正确初始化RateRuleId数组:penParams.RateRuleId=new Int32[10]。大小无关紧要,因为可以提供的速率ID数量有限。谢谢你的帮助,非常感谢。Ivor@Ivor:无论如何,拥有RateRuleIds属性的开发人员通常应该负责确保在其公共界面上公开之前正确初始化该属性。很高兴我能帮忙