RelayCommand von Lambda mit Konstruktorparametern

Wenn ich in einer XAML-Datei einen Button an "Command" aus der folgenden Klasse binde und dann auf den Button klicke, wird DoIt nicht ausgeführt:

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

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

  public ICommand Command { get; private set; }
}

Es funktioniert jedoch, wenn ich ein Feld aus p1 initialisiere und das Feld als Parameter an den Methodenaufruf im Lambda übergebe:

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

Warum versagt der erste, aber der zweite funktioniert wie erwartet?

Wahrscheinlich relevant:Wie funktionieren Verschlüsse hinter den Kulissen? (C #)

EDIT: Zur Verdeutlichung würde das Folgende auch für mich funktionieren. Ich möchte jedoch immer noch wissen, warum das zweite Beispiel das tat, was ich erwartet hatte, aber das erste nicht.

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

Antworten auf die Frage(4)

Ihre Antwort auf die Frage