2

我有以下类定义:

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>,我应该如何解决这个问题?

4

3 回答 3

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行动清单都必须是接受任何果实的行动。

于 2013-04-17T13:26:11.637 回答
1

当然不是,List<EventArgs>也不能赋值List<object>,即使 EventArgs 是一个对象。

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

可能是一个解决方案,但我不知道你的应用程序。

于 2013-04-17T13:27:24.243 回答
1

这是一个协方差和逆变问题。我建议您阅读有关它的msdn 文章。它对您的问题有完整的答案。

于 2013-04-17T13:33:50.083 回答