Taimoor Hassan Ответов: 2

Странно nullreference исключение. При использовании предикатов


Кодекс все объясняет. я пытался достать _dealer.Имя в цикле forEach без использования предиката, и это прекрасно работает. Но с предикатом ON он начинает выбрасывать это исключение


private void btnDealerLoadTockets_Click(object sender, EventArgs e)
        {
            // MainListBox.DataSource = LoadDealersList();
            // And Yes , there are items in the DealersList. dlist.Count returns 5 
    
            List<Dealer> dlist = LoadDealersList();
            Dealer _Dealer = dlist.Find(x => x == (Dealer)MainListBox.SelectedItem);
            foreach (Dealer item in dlist)
            {
                if (item.name == _Dealer.name)
                {
                    Console.WriteLine("Match Found");
                }
            }
        }


Что я уже пробовал:

Кодекс все объясняет. я пытался достать _dealer.Имя в цикле forEach без использования предиката, и это прекрасно работает. Но с предикатом ON он начинает выбрасывать это исключение

F-ES Sitecore

На какой линии находится исключение?

Suvabrata Roy

Как вы связали MainListBox? потому что вы пытаетесь привести выбранный товар к типу дилера.

0x01AA

Действительно ли LoadList () возвращает списки для ListBox _and_ ButtonClick, построенные на одной и той же ссылке дилера ?
Это потому, что в x => x == (Dealer)MainListBox.SelectedItem сравнивает две ссылки.

Другими словами: в случае, если содержание списка (дилеры) будет создано новое, при получении списка у вас возникнет такая проблема. И это даже тогда, когда реквизит дилеров обоих списков совершенно одинаков...а вот ссылки-нет.

2 Ответов

Рейтинг:
0

Richard Deeming

Вы должны научиться использовать отладчик как можно скорее. Установите точку останова в первой строке вашего метода и шагайте по ней строка за строкой, исследуя значения переменных. Вы быстро увидите, какой из них null когда вы этого не ожидаете.


Наиболее вероятной причиной является то, что Find метод возвращается null, так что вы получаете NullReferenceException когда вы пытаетесь получить доступ к свойству на _Dealer переменная. Простое решение состоит в том, чтобы проверить переменную, прежде чем пытаться ее использовать.

if (_Dealer != null)
{
    foreach (Dealer item in dlist)
    {
        if (item.name == _Dealer.name)
        {
            Console.WriteLine("Match Found");
        }
    }
}


Рейтинг:
0

BillWoodruff

Если ваша цель здесь состоит в том, чтобы определить, есть ли совпадение между item.name и еще Dealer.name в списке "дилер"... как насчет:

if(dlist.Any(dlr => dlr.name == item.Name)
{
   // whatever
}

// if you need to do something with the match:

Dealer match = dlist.FirstOrDefault(dlr => dlr.name == item.name);

// default for Reference Types is 'null
if(match == null}
{
    // whatever
}
else
{
    // use the match for something ?
}
Действительно нужно знать сообщение об ошибке, чтобы понять, что происходит с 'Find with Predicate.