引用局部变量的匿名方法会引发运行时错误

时间:2010-09-28 20:37:05

标签: c# c#-3.0

C#.Net 3.5我得到一个图像列表,制作一个副本,提供一个空列表,实例化一个xaml对话框,它有一个事件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 :(得分:0)

尝试将第二个语句更改为:

List<ILMWorkOrderImage> m_OriginalList = new List<ILMWorkOrderImage>(workOrderImages);

答案 1 :(得分:0)

我打算将这一个粉笔到调试器(VS 2008)。我提出的代码是在switch语句的第七种情况下:我在交换机的顶部设置了一个断点,并且跳到了这个特定的情况。当我放弃这样做时,问题就消失了。此外,如果我将代码放在交换机外(并且没有使用断点),它运行正常。我还发现,即使在Debug中,如果我将代码拉出到一个方法中并且让case语句执行该方法,那我也很好。并且(感谢所有人的观察),我发现,虽然我可以整天在这个应用程序中重现这种行为,但我无法在一个小的控制台应用程序中重现它。