Ссылка на объект не установлена на экземпляр объекта [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
немного, и теперь это работает для меня. Еще раз спасибо!