无法在C#中传递子接口作为参数

use*_*245 1 c# parameters inheritance interface

我有以下接口层次结构:

public interface IActor { ... }
public interface IHealthUser : IActor { ... }
Run Code Online (Sandbox Code Playgroud)

和第三个接口:

public interface IAction { void Perform(IActor caster) }
Run Code Online (Sandbox Code Playgroud)

为什么以下不合法,我能以某种方式绕过它吗?

public class HealthPotion : IAction
{
    public void Perform(IHealthUser caster) { ... }
}
Run Code Online (Sandbox Code Playgroud)

Avn*_*tan 6

合同由IAction州定义,您可以Perform对任何行动采取行动IActor.任何 IActor.不仅如此IHealthUser.您HealthPotion尝试做的只是实现一个子集IAction,意味着仅在IActors 的子集上执行其任务.这不是IAction界面所说的.

如果您希望特定IAction于能够限制IActor其适用的类型,则可以使用通用约束来执行此操作:

public interface IAction<TAppliesTo> where TAppliesTo : IActor
{
    void Perform(TAppliesTo appliesTo);
}

public class UniversalAction : IAction<IActor>
{
   public void Perform (IActor anyone) {}
}

public class HealthPotion : IAction<IHealthUser>
{
   public void Perform (IHealthUser healthUserOnly){}
}
Run Code Online (Sandbox Code Playgroud)