gpt4 book ai didi

c# - 如何在 C# 中的类型安全集合中存储具有受限泛型类型的 Action 委托(delegate)?

转载 作者:行者123 更新时间:2023-11-30 19:25:12 24 4
gpt4 key购买 nike

假设我想将委托(delegate)存储在这样的集合中:

public void AddDelegate<T>(Action<T> action) where T : ISomething
{
_delegates.Add(action);
}

_delegates 的类型应该是什么?是吗?

尝试使用 IList<Action<ISomething>> _delegates;导致错误消息 Argument type 'System.Action<T>' is not assignable to parameter type 'System.Action<ISomething>' 对于 Add在上面打电话。但为什么它不起作用?编译器应该“知道”T 必须是 ISomething。 .如果我不想通过使用例如来放松类型安全,我有什么选择?一个IList<object>或在泛型类型上参数化整个类 T

最佳答案

_delegates必须是 IList<Action<T>> 类型.

因此您必须添加 <T> where T : ISomething上课。

或者,取消泛型并支持 Action<ISomething>直接。

所以你的两个选择是:

public class Delegates<T> where T : ISomething
{
private List<Action<T>> _delegates;

public void AddDelegate(Action<T> action)
{
_delegates.Add(action);
}
}

或者

public class Delegates
{
private List<Action<ISomething>> _delegates;

public void AddDelegate(Action<ISomething> action)
{
_delegates.Add(action);
}
}

编辑 As Sehnsucht points out, there's a third option : 包装 Action<T>Action<ISomething> 中委托(delegate)委托(delegate),然后 OP 可以实现他最初想要的。

原因是虽然 TISomething 的“子类型”(实现者) , Action<T>不是 Action<ISomething> 的子类型, 事实上 as dcastro explains in his answer ,事实恰恰相反(尽管这看起来违反直觉)。即使使用转换,您也无法添加 Action<T> 的实例到 Action<ISomething> 的列表.

关于c# - 如何在 C# 中的类型安全集合中存储具有受限泛型类型的 Action 委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30529956/

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