我内联分配了一个匿名方法,并在该代码块中尝试分配一个String
在方法分配之前声明的变量。
该调用导致异常:
NullReferenceException:对象引用未设置为对象的实例。
这是相关的代码:
else
{
String imagesDirectory = null; // <-- produces NullReferenceException
if (Version <= 11.05)
{
String message = "Continue with update?";
DialogResult result = MessageBox.Show(message, "Continue?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
Boolean isValid = false;
while (!isValid)
{
using (frmRequestName frm = new frmRequestName(true))
{
frm.Text = "Select Directory";
frm.atbNameOnButtonClick += (s, e) =>
{
using (FolderBrowserDialog dlg = new FolderBrowserDialog())
{
dlg.Description = "Select the directory for image storage";
dlg.SelectedPath = "C:\\";
if (dlg.ShowDialog() == DialogResult.OK)
imagesDirectory = dlg.SelectedPath; // <-- I think this is the root cause
//frm.EnteredName = dlg.SelectedPath; // <-- this does NOT cause an exception...why?
}
};
if (frm.ShowDialog(null, Icon.FromHandle(SharedResources.Properties.Resources.OpenFolder_16x.GetHicon())) == DialogResult.OK)
{
isValid = ValidateImagesPath(imagesDirectory);
}
}
}
}
else
{
Cursor.Current = Cursors.Default;
return false;
}
}
}
一开始,变量的赋值imagesDirectory
实际上是引发了异常。但我认为这是因为在匿名方法中使用了该变量。
有人可以请:
- 验证或反驳我的怀疑
- 解释为什么我是正确的/不正确的
- 解释为什么编译器在不抛出自己的编译时错误的情况下使这成为可能
PS - 我用不同的变量替换了匿名方法中的变量用法,错误就消失了。很明显,我对根本原因是正确的,但我仍然不知道为什么......
在这种情况下,我使用的是 .NET 3.5。
编辑:
这是进一步的方法分配......
public partial class frmRequestName : Form
{
public EventHandler atbNameOnButtonClick;
private void frmRequestName_Load(Object sender, EventArgs e)
{
atbName.OnButtonClick += atbNameOnButtonClick; //this is a class that inherits from System.Windows.Forms.TextBox
}
}