不能转换类型'& # 39; System.Delegate& # 39;
本文关键字:System Delegate 转换 类型 不能 | 更新日期: 2023-09-27 18:18:05
我需要做下面的事情,但得到上面的错误
class PrioritizedEvent<DelegateType>
{
private ArrayList delegates;
public PrioritizedEvent()
{
this.delegates = new ArrayList();
}
public void AddDelegate(DelegateType d, int priority)
{
this.delegates.Add(new PrioritizedDelegate<DelegateType>((Delegate)d, priority));
this.delegates.Sort();
}
protected class PrioritizedDelegate<DelegateType> : IComparable
{
public Delegate d;
public int priority;
public PrioritizedDelegate(Delegate d, int priority)
{
this.d = d;
this.priority = priority;
}
}
}
我不能将DelegateType D设置为Delegate
确实,您不能指定: Delegate
约束—这根本无法完成(编译器会阻止您)。您可能会发现添加where DelegateType : class
是有用的,只是为了停止使用int
等,但您不能通过泛型来完成这一切。您将需要通过object
强制转换:
(Delegate)(object)d
然而,我个人认为你应该存储DelegateType
,而不是Delegate
,即
protected class PrioritizedDelegate : IComparable
{
public DelegateType d;
public int priority;
public PrioritizedDelegate(DelegateType d, int priority)
{
this.d = d;
this.priority = priority;
}
}
注意我从上面删除了<DelegateType>
:因为它嵌套在一个泛型类型(PrioritizedEvent<DelegateType>
)中,它已经从父类型继承了这个。
class PrioritizedEvent<TDelegateType> where TDelegateType : class
{
private readonly List<PrioritizedDelegate> delegates
= new List<PrioritizedDelegate>();
public void AddDelegate(TDelegateType callback, int priority)
{
delegates.Add(new PrioritizedDelegate(callback, priority));
delegates.Sort((x,y) => x.Priority.CompareTo(y.Priority));
}
protected class PrioritizedDelegate
{
public TDelegateType Callback {get;private set;}
public int Priority {get;private set;}
public PrioritizedDelegate(TDelegateType callback, int priority)
{
Callback = callback;
Priority = priority;
}
}
}
您的DelegateType
完全不受限制。对于编译器来说,它可能是一个int
或某个类或委托。
通常情况下,你可以使用一些约束来限制泛型类型,不幸的是,将其限制为委托是不允许的。
Marc Gravell在回答为什么c#泛型不允许委托类型约束的问题时给出了一个解决方法。