最適化で GC.KeepAlive() が無効になる?

csc /o+ /debug- だと次のコードは「 GC による回収済み delegate へのアクセス」で NullReferenceException が発生する。csc /o+ /debug+ だと平気なので、JIT Tracking を無効にする最適化を実施すると GC.KeepAlive() が効かなくなるような最適化をやってしまうらしい?
おじさんの環境だけですか?

  private delegate bool ProgressHandler(int tag, int percent);
  
  [DllImport("test.dll")]
  private static extern int PInvokeAPI(int tag, ProgressHandler progress);
  
  private int Run(int tag)
  {
    ProgressHandler callback = new ProgressHandler(this.OnProgress);
    try
    {
        return PInvokeAPI(tag, callback);
    }
    finally
    {
        GC.KeepAlive(callback);
    }
  }

  // PInvokeAPI の中から何回も呼び出される  
  private bool OnProgress(int tag, int percent)
  {
    // continue processing
    return true;
  }