Анонимный метод, ссылающийся на локальные переменные, выдает ошибку во время выполнения - PullRequest
0 голосов
/ 29 сентября 2010

C # .Net 3.5 Я получаю список изображений, создаю копию, предоставляю пустой список, создаю экземпляр xaml Dialog с событием OnNameChanged, равным Action<ILMWorkOrderImage>. Следующий код создает, но во время выполнения выдает исключение нулевой ссылки во втором операторе, присваивании m_OriginalList. Если я пропущу это, в следующем операторе будет сгенерировано исключение нулевой ссылки, простое назначение нового списка! На эти две переменные ссылаются в анонимном методе, который обрабатывает событие OnNameChanged. Если я определю m_OriginalList и m_WithNameChanges как переменные-члены, все будет хорошо. Я обычно использую локальные переменные в моих анонимных методах; Вы видите причину, по которой это не сработает в этот раз?

List<ILMWorkOrderImage> workOrderImages = wo.GetImages( );
// Copy the list for comparison later
List<ILMWorkOrderImage> m_OriginalList = new List<ILMWorkOrderImage>( workOrderImages );
List<ILMWorkOrderImage> m_WithNameChanges = new List<ILMWorkOrderImage>( );
AddPicturesDialog dlg2 = new AddPicturesDialog( context, workOrderImages );
dlg2.OnNameChanged += ( ILMWorkOrderImage _ChangedWOI ) => 
{
    if ( m_OriginalList.Contains( _ChangedWOI ) && !m_WithNameChanges.Contains( _ChangedWOI ) )
    {
        m_WithNameChanges.Add( _ChangedWOI );
    }
};
if ( true == dlg2.ShowDialog( ) )...

Ответы [ 2 ]

0 голосов
/ 29 сентября 2010

Я собираюсь написать это отладчику (VS 2008).Код, который я представил, был в седьмом случае оператора switch: я установил точку останова в верхней части коммутатора и перешел к этому конкретному случаю.Когда я прекратил это делать, проблема ушла.Кроме того, если я поместил код за пределы коммутатора (и не использовал точку останова), он работал нормально.Я также обнаружил, что даже в Debug, если я вытаскивал код в метод и выполнял оператор case только для выполнения метода, у меня тоже все было в порядке.И (спасибо всем за внимание), я обнаружил, что, хотя я мог воспроизводить это поведение в этом приложении в течение всего дня, я не мог воспроизвести его в небольшом консольном приложении.

0 голосов
/ 29 сентября 2010

Попробуйте изменить второе утверждение на:

List<ILMWorkOrderImage> m_OriginalList = new List<ILMWorkOrderImage>(workOrderImages);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...