Process.Exitedイベントの謎

ってほどのことは無いのですが、ちょっと嵌りました。例えば、電卓を起動させて、一定時間経ったら強制終了させるコードがあったとします。

using System;
using System.Diagnostics;

class Program {
  static void Exited(object Sender, EventArgs e) {
    Console.WriteLine("Exited.");
  }

  static void Main(string[] args) {
    // 3秒でアプリケーションを終了させる
    int timeout = 3000;
    Process p = Process.Start("calc.exe");
    p.Exited += new EventHandler(Exited);
    // イベント通知要求を設定し忘れ
    // p.EnableRaisingEvents = true;
    p.WaitForInputIdle();
    if (!p.WaitForExit(timeout)) {
      // タイムアウト
      p.CloseMainWindow();
    }

    // プロセスの終了をチェックする
    if (p.HasExited) {}
  }
}

/* 結果
Exited.
 */

終了したら「Exited.」というメッセージを表示させるために、Exitedイベントを登録して上記プログラムを実行すると、一見上手く動いているように見えます。しかし、

// プロセスの終了をチェックする
// if (p.HasExited) {}

このようにコメントアウトするとExitedイベントが呼び出されなくなってしまいました。まぁ、話は単純で、

// イベント通知要求を設定し忘れ
p.EnableRaisingEvents = true;

EnableRaisingEventsを設定し忘れていただけです。ですが、設定し忘れていてもHasExitedやExitCodeにアクセスするとExitedイベントが呼ばれてしまうことに、ちょっと戸惑いました。ヘルプを読む限りはこんな動作をするようには見えないのですが・・・