无法将Action <tderivedthing>分配给Action <ithing> </ithing> </tderivedthing>

时间:2013-04-17 13:20:25

标签: c#

我有以下类定义:

public class Registry
{
     private List<Action<IThing>> _thingActions = new List<Action<IThing>>();

     public Register<TDerivedThing>(Action<TDerivedThing> thingAction)
          where TDerivedThing : IThing
     {
        // this line causes compilation issue
        _thingActions.Add(thingAction);
     }     
}

为什么这会抱怨它无法将Action<TDerivedThing>分配给Action<IThing>,我应该如何解决这个问题?

3 个答案:

答案 0 :(得分:7)

如果C#允许你这样做,这样的代码将是有效的:

interface IFruit {
    void Eat();
}

class Apple : IFruit {
    // ...
    void EatApple();
}

class Pear : IFruit {
    // ...
    void EatPear();
}

void EatApple(Apple a) {
    a.EatApple();
}

void EatPear(Pear p) {
    p.EatPear();
}

Action<IFruit> fruitAction = EatApple;
fruitAction(new Pear()); // Calls EatApple(new Pear())

演员表无效,因为它不应该是,你不应该首先尝试这样做。您所有必须IThing行动列表都是接受任何水果的行为。

答案 1 :(得分:1)

当然不是,List<EventArgs>也不能分配给List<object>,即使EventArgs是一个对象。

 public void Register<TDerivedThing>(Action<TDerivedThing> thingAction)
      where TDerivedThing : IThing
 {
    _thingActions.Add(t => thingAction(t as TDerivedThing));
 }

可能是一个解决方案,但我不知道你的申请。

答案 2 :(得分:1)

这是一个协方差和逆转问题。我建议你阅读msdn article。它完全回答了你的问题。