1

我需要执行以下操作,但出现上述错误

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

4

2 回答 2

1

事实上,你不能指定一个: Delegate约束——它根本无法完成(编译器阻止你)。您可能会发现添加 a 很有用where DelegateType : class,只是为了停止与intetc 一起使用,但您不能通过泛型来做到这一点。您将需要通过以下方式进行转换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;
        }
    }
}
于 2013-06-13T08:11:39.060 回答
0

DelegateType的完全不受限制。因为所有编译器都知道它可能是一个int或某个类或委托。

现在通常您可以使用一些约束来限制泛型类型,不幸的是,不允许将其限制为 delagate。

Marc Gravell对为什么C# 泛型不允许委托类型约束的问题的回答为您提供了一种解决方法。

于 2013-06-13T08:11:46.387 回答