简体   繁体   中英

NullReferenceException C# adding to dictionary

Here is a cut down snippet of the code. Both tupleUnits.Key and tupleR are non-null objects.

public partial class AllLicenseeUnits : System.Web.UI.Page {
  protected Dictionary<int, TupleRecordsRange> unitsInTuple = new Dictionary<int, TupleRecordsRange>();

  public Paginator getPaginator(int itemsPerPage) {
    if (unitsInTuple == null) {
        Dictionary<int, int> tuplesUnits = DataAccess.CountLicenseeUnitsTuple(Session["licensee"] as Licensee);
        tuplesUnits = tuplesUnits.Where(item => item.Value > 0).ToDictionary(item => item.Key, item => item.Value); 
        int index = 0;
        foreach(KeyValuePair<int, int> tupleUnits in tuplesUnits) {
            TupleRecordsRange tupleR =  new TupleRecordsRange{start_index = index, end_index= (index + tupleUnits.Value -1)};
            unitsInTuple.Add(tupleUnits.Key, tupleR);
            index += tupleUnits.Value;
        }
    }
    int sumUnits = unitsInTuple.Sum(item => item.Value.totalRecords);
    Paginator paginator = new Paginator(itemsPerPage, sumUnits);
    if (Request.QueryString["page"] != null)
    {
        paginator.currentPage = int.Parse(Request.QueryString["page"]);
    }
    return paginator;
  }
}

I don't understand why this is happening since both the perameters I pass into.Add() are not null. Here are the watches:

-       tupleUnits  {[1, 3081]} System.Collections.Generic.KeyValuePair<int,int>

+       tupleR  {AllLicenseeUnits.TupleRecordsRange}    AllLicenseeUnits.TupleRecordsRange

Stack Trace:

  at AllLicenseeUnits.getPaginator(Int32 itemsPerPage) in C:\Users\User\Documents\Bla_Devel\AllLicenseeUnits.aspx.cs:line 46
   at AllLicenseeUnits.Page_Load(Object sender, EventArgs e) in C:\Users\User\Documents\Bla_Devel\AllLicenseeUnits.aspx.cs:line 32
   at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
   at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
   at System.Web.UI.Control.OnLoad(EventArgs e)
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

In your example you haven't created the dictionary before you add to it.

if (unitsInTuple == null) {
            ...
            unitsInTuple.Add(tupleUnits.Key, tupleR);
            ...
        }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM