質問: true; } private void plus_Click(object sender, RoutedEventArgs e) { Debug.WriteLine("plus"); plus.DragEnter += Plus_DragEnter; } private void Plus_DragEnter(object sender, DragEventArgs e) { } private void minus_Click(object sender, RoutedEventArgs e) { Debug.WriteLine("minus"); plus.DragEnter -= Plus_DragEnter; } ```
回答: イベントというよりはデリゲートの仕様です。 C# (.NET) のデリゲートは`+`, `-`, `+=`, `-=`演算子による結合と削除(マルチキャストデリゲート)をサポートしており、内部的にはデリゲートオブジェクトのリスト(呼び出しリスト; invocation list)への追加/削除が実行されます。 * - および -= 演算子 - C# リファレンス | Microsoft Docs > > 右側のオペランドの呼び出しリストが左側のオペランドの呼び出しリストの適切な連続するサブリストでない場合は、演算結果は左側のオペランドになります。 たとえば、マルチキャストのデリゲートの一部ではないデリゲートを削除しても何も行われず、マルチキャストのデリゲートは変更されません。 > > > デリゲートの結合と削除は、内部的には`System.Delegate`クラスの`Combine()`メソッドや`Remove()`メソッド呼び出しに展開されます。 * Delegate Class (System) | Microsoft Docs C#の`event`は、カプセル化のために`add`, `remove`アクセッサーを使ってデリゲートの操作に制限をかけているだけです。通常は`add`, `remove`アクセッサーをプログラマーがカスタム定義することはなく、コンパイラーによって自動生成されたものを使います。 * event - C# リファレンス | Microsoft Docs