我有以下类定义:
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>
,我应该如何解决这个问题?
答案 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。它完全回答了你的问题。