不能转换类型'& # 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

不能转换类型'& # 39; System.Delegate& # 39;

确实,您不能指定: 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#泛型不允许委托类型约束的问题时给出了一个解决方法。