gpt4 book ai didi

c# - += 和 Delegate.Combine 的区别

转载 作者:太空狗 更新时间:2023-10-29 23:12:10 28 4
gpt4 key购买 nike

我已经构建了一个事件系统来维护委托(delegate)的 dictionary,通过通用的订阅/取消订阅方法(每个方法都采取一个 Action)向这个 dictionary 添加/删除元素type T),并且有一个 Publish 方法在发生某些事情时通知订阅者(它也采用类型 T 的 Action)。一切正常,但我注意到在向我的 dictionary 添加或删除元素时我不能使用 += 或 -=,因为传递到方法(T 的 Action )的类型与存储在 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;
}
}

我基本上理解 Jon Skeet 在这里的回答 += operator for Delegate具体来说,这部分

当两个操作数都是某种委托(delegate)类型 D 时,二元 + 运算符执行委托(delegate)组合。(如果操作数具有不同的委托(delegate)类型,则会发生绑定(bind)时错误。)

我不明白的是这个

编译器将其转换为对 Delegate.Combine 的调用。反向操作,使用 - 或 -=,使用 Delegate.Remove

Delegate.Combine 相比,当我使用 += 或 -= 时到底发生了什么?两者之间有什么区别,使一种实现有效,另一种实现无效?

最佳答案

在您链接的答案末尾,它说:

Since System.Delegate is not a delegate type, operator + is not defined for it.

这解释了为什么这不起作用(两个操作数都是 Delegate ):

delegates[typeof(T)] += del as Delegate;

Delegate.Combine工作是因为 it is declared like this :

public static Delegate Combine (params Delegate[] delegates);

注意它如何接受类型为 Delegate 的参数,而不是特定的委托(delegate)类型。它会抛出 ArgumentException如果委托(delegate)不是同一类型。

所以编译器不仅改变了+接线员到 Delegate.Combine ,它也做一些类型检查!另一方面,如果使用 Delegate.Combine,则不会进行编译时类型检查。直接地。 Delegate.Combine仅在运行时检查类型。

所有其他行都有效,因为您正在强制转换,即告诉编译器委托(delegate)是什么类型,使 + 的两个操作数都成为类型为 Action<T> .

关于c# - += 和 Delegate.Combine 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55627636/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com