Причина, по которой вы получаете ошибку «use unassigned variable», заключается в том, как компилятор фактически генерирует код. Когда вы используете синтаксис делегата {}, компилятор создает для вас реальный метод. Поскольку вы ссылаетесь на присоединенное поле в своем делегате, компилятор пытается передать локальную переменную attach
в сгенерированный метод делегата.
Вот примерно переведенный код, который должен помочь прояснить ситуацию:
private void ofdAttachment_FileOk(object sender, CancelEventArgs e)
{
Action attach = _b<>_1( attach );
System.Threading.ThreadPool.QueueUserWorkItem((o) => attach());
}
private Action _b<>_1( Action attach )
{
if (this.InvokeRequired)
{
// but it has compilation here
// "Use of unassigned local variable 'attach'"
this.Invoke(new Action(attach));
}
else
{
// attaching routine here
}
}
Обратите внимание, что перед передачей поля присоединения к методу _b <> _ 1 он инициализируется.