RelayCommand de lambda con parámetros de constructor

Si, en un archivo XAML, ato un botón al "Comando" de la siguiente clase, entonces al hacer clic en el Botón no se ejecuta DoIt:

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

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

  public ICommand Command { get; private set; }
}

Sin embargo, funciona si inicializo un campo desde p1 y paso el campo como parámetro a la llamada al método dentro de la 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 qué falla el primero, pero el segundo funciona como se esperaba?

Probablemente relevante:¿Cómo funcionan los cierres detrás de escena? (C#)

EDITAR: Para aclarar, lo siguiente también funcionaría para mí. Sin embargo, todavía me gustaría saber por qué el segundo ejemplo hizo lo que esperaba, pero el primero no.

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; }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta