Format-Listの謎

Format-Listを実行するとスレッドが変わる?

以下は、ボタンを1個乗せたフォームを表示するサンプルです。
当たり前ですが、普通に動作します。

リスト1


[Void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$form = New-Object Windows.Forms.Form
$button = New-Object Windows.Forms.Button
$form.Controls.Add($button)
$form.ShowDialog()

ところが、以下を実行すると、フォームにボタンを追加する行($form.Controls.Add($button))でエラーが発生します。

スト2


[Void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$form = New-Object Windows.Forms.Form
$button = New-Object Windows.Forms.Button
$button | Format-List
$form.Controls.Add($button)
$form.ShowDialog()

スト2で発生するエラー内容
"1" 個の引数を指定して "Add" を呼び出し中に例外が発生しました:
"あるスレッドで作成されたコントロールに対して、
別のスレッドのコントロールを親にすることはできません。"
発生場所 行:1 文字:19
+ $form.Controls.Add( <<<< $button)

リスト1とリスト2の違いは以下を実行したかどうかだけです。

$button | Format-List

Format-ListはButtonオブジェクトを破棄し、別のスレッドで再生成したのでしょうか?
エラーの理由が分かりません。

検証

フォームとボタン両方に対してFormat-Listを実行してみるとどうでしょうか?

リスト3


[Void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$form = New-Object Windows.Forms.Form
$form | Format-List
$button = New-Object Windows.Forms.Button
$form.Controls.Add($button) # エラー
$button | Format-List
$form.Controls.Add($button) # 成功

フォームだけにFormat-Listを実行した場合はエラーが出ますが、ボタンにもFormat-Listを実行すると、エラーが発生しません。

仮説ですが、

Format-Listは自身専用のスレッドでオブジェクトの整形を行う。
その際、対象オブジェクトを自身のスレッドで再生成する。

・・・という事なのでしょうか?


情報求む!