Ссылка на объект не установлена ​​на экземпляр объекта [C#]

Я получаю следующую ошибку:

Object reference not set to an instance of an object

Я не знаю, что является причиной этой ошибки и как ее решить, вот мой код:

while(dr.Read())
    {
     string variant = dr.GetString(0);
     int size = dr.GetInt32(1);
     int quantity = dr.GetInt32(2);

     DataRow x = dt.Rows
                  .Cast<DataRow>()
                  .Where(r => r["variant_name"].Equals(variant) && r["size"].Equals(size))
                  .FirstOrDefault();
                  x["quantity"] = quantity;             

      }

Я получаю сообщение об ошибке в этой строке -> x["quantity"] = quantity;Мне интересно, почему это даст нулевое значение, потому что я проверил в своей базе данных, что он должен возвращать ровно одно совпадение.

3 ответа

FirstOrDefault возвращает ноль, если элемент не найден, и вы пытаетесь получить доступ к этому объекту.

В последней строке х ноль, исправить с

if(x != null)
   x["quantity"] = quantity;

Это происходит, если ваше условие (.Where) не приводит к совпадению.
На этом этапе FirstOrDefault вернуть часть по умолчанию
и это пустое значение для ссылочного объекта, как описано в MSDN

Значением по умолчанию для ссылочного и обнуляемого типов является null.

while(dr.Read())
 {
  string variant = dr.GetString(0);
  int size = dr.GetInt32(1);
  int quantity = dr.GetInt32(2);

  DataRow x = dt.Rows
                .Cast<DataRow>()
                .Where(r => (r["variant_name"].ToString().Equals(variant) && Convert.ToInt32(r["size"]).Equals(size)))
                .FirstOrDefault();

   if (x != null)
   {
       x["quantity"] = quantity;  
   }       
 }

Спасибо за ваш ответ, он мне очень помог. Я только что изменил линию .Where немного, и теперь это работает для меня. Еще раз спасибо!

Другие вопросы по тегам