RelayCommand de lambda com parâmetros do construtor

Se, em um arquivo XAML, vincular um Button a "Command" da classe a seguir, clicar no botão não fará com que o DoIt seja executado:

class Thing()
{
  public Thing(Foo p1)
  {
    Command = new RelayCommand(() => DoIt(p1));
  }

  private DoIt(Foo p)
  {
    p.DoSomething();
  }

  public ICommand Command { get; private set; }
}

No entanto, funciona se eu inicializar um campo de p1 e passar o campo como um parâmetro para a chamada de método dentro do lambda:

class Thing()
{
  private Foo field;
  public Thing(Foo p1)
  {
    field = p1;
    Command = new RelayCommand(() => DoIt(field));
  }

  private DoIt(Foo p)
  {
    p.DoSomething();
  }

  public ICommand Command { get; private set; }
}

Por que o primeiro falha, mas o último funciona como esperado?

Provavelmente relevante:Como os fechamentos funcionam nos bastidores? (C #)

EDIT: Para esclarecer, o seguinte também funcionaria para mim. No entanto, eu ainda gostaria de saber por que o segundo exemplo fez o que eu esperava, mas o primeiro não.

class Thing()
{
  private Foo field;
  public Thing(Foo p1)
  {
    field = p1;
    Command = new RelayCommand(DoIt);
    //Command = new RelayCommand(() => DoIt()); Equivalent?
  }

  private DoIt()
  {
    field.DoSomething();
  }

  public ICommand Command { get; private set; }
}

questionAnswers(2)

yourAnswerToTheQuestion