Когда лямбда-запрос использует «Содержит» и не соответствует условию «Ссылка на объект не установлена ​​для экземпляра объекта», возвращается ошибка - PullRequest
0 голосов
/ 15 декабря 2010

Платформа C #, Dot net 4.0

var city0 = DataCache.GetAllCities().Where(c => c.GeoName.Contains("Dubai")).FirstOrDefault();

Переменная Duabi существует в данных и возвращает городской объект

var city1 = DataCache.GetAllCities().Where(c => c.CityID== 23804982) .FirstOrDefault();

Идентификатор 23804982 не существует в данных, и это возвращает нулевой объект

var city2 = DataCache.GetAllCities().Where(c => c.GeoName.Contains("WrongCityName")).FirstOrDefault();

Переменная WrongCityName не существует в данных, и это возвращает следующую ошибку.

Ссылка на объект не установлена ​​для экземпляра объекта.

[EDIT] Я получил ошибку при выполнении последнего запроса.Не тогда, когда я оцениваю city2

Ответы [ 2 ]

5 голосов
/ 15 декабря 2010

Ну, city2 будет нулевым, потому что вы использовали FirstOrDefault - и значение по умолчанию для классов равно нулю.

Вы должны проверить его на ничтожность перед использованием:

if (city2 != null)
{
    // Okay, I found a matching city. Now I can use it
}

Теперь предполагается, что код, который вы на самом деле дали, выполняется без проблем. Не было бы, если бы c.GeoName было нулевым для какого-то города ... потому что вы бы звонили Contains по нулевой ссылке. Вы можете исправить это с помощью:

var city2 = DataCache.GetAllCities()
                     .Where(c => c.GeoName != null &&
                                 c.GeoName.Contains("WrongCityName"))
                     .FirstOrDefault();
3 голосов
/ 15 декабря 2010

Может быть c или c.GeoName пусто - вы проверяли их?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...