Я создал систему событий, которая поддерживает dictionary
делегатов, добавляет / удаляет элементы к этому dictionary
с помощью общих методов подписки / отмены подписки (каждый из которых выполняет действие type
T) и имеет Метод публикации, чтобы уведомить подписчиков, когда что-то происходит (который также принимает действие типа T). Все работает нормально, но я заметил, что не могу использовать + = или - = при добавлении или удалении элементов к моему dictionary
, так как типы, передаваемые в методы (Action of T), не соответствуют типам, хранящимся в dictionary
(Delegate
). Следующий фрагмент показывает, что я могу и не могу сделать.
private readonly Dictionary<Type, Delegate> delegates = new Dictionary<Type, Delegate>();
public void Subscribe<T>(Action<T> del)
{
if (delegates.ContainsKey(typeof(T)))
{
// This doesn't work!
delegates[typeof(T)] += del as Delegate;
// This doesn't work!
delegates[typeof(T)] += del;
// This is ok
delegates[typeof(T)] = (Action<T>)delegates[typeof(T)] + del;
// This is ok
var newDel = (Action<T>)delegates[typeof(T)] + del;
delegates[typeof(T)] = newDel;
// This is ok
del += (Action<T>)delegates[typeof(T)];
delegates[typeof(T)] = del;
// This is ok
delegates[typeof(T)] = Delegate.Combine(delegates[typeof(T)], del);
}
else
{
delegates[typeof(T)] = del;
}
}
Я в основном понимаю ответ Джона Скита здесь + = оператор для делегата , в частности, эта часть
Бинарный оператор + выполняет комбинацию делегатов, когда оба операнда имеют некоторый тип делегата D. (Если операнды имеют разные типы делегатов, возникает ошибка времени привязки.)
Что я не понимаю, это
Компилятор превращает его в вызов Delegate.Combine
. Обратная операция с использованием - или - =, использует Delegate.Remove
.
Что именно происходит, когда я использую + = или - =, вместо Delegate.Combine
? Каковы различия между ними, делающими одну реализацию допустимой, а другую недействительной?