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

C# 无法在C中将子接口作为参数传递#,c#,inheritance,parameters,interface,C#,Inheritance,Parameters,Interface,我有以下接口层次结构: public interface IActor { ... } public interface IHealthUser : IActor { ... } 以及第三个接口: public interface IAction { void Perform(IActor caster) } 为什么下面的内容不合法,我可以绕开它吗 public class HealthPotion : IAction { public void Perform(IHealthUse

我有以下接口层次结构:

public interface IActor { ... }
public interface IHealthUser : IActor { ... }
以及第三个接口:

public interface IAction { void Perform(IActor caster) }
为什么下面的内容不合法,我可以绕开它吗

public class HealthPotion : IAction
{
    public void Perform(IHealthUser caster) { ... }
}

您需要实现与接口定义相同的签名。您在界面中使用了IActor,但在IAction界面的实现中使用了IHealthUser。您应该使用IActor参数实现执行。但是,可以使用实现IHealthUser的类调用它。您需要实现与接口定义相同的签名。您在界面中使用了IActor,但在IAction界面的实现中使用了IHealthUser。您应该使用IActor参数实现Perform。但是,它可以通过实现IHealthUser

的类调用,
IAction
定义的契约声明您可以
对任何
IActor
执行操作。任何人都可以。不仅
IHealthUser
。您的
HealthPotion
尝试只实现
IAction
的一个子集,这意味着只在
IActor
的一个子集上执行其任务。这不是
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){}
}
公共接口IAction,其中TAppliesTo:IActor
{
无效执行(Tapplies to appliesTo);
}
公共类通用性:IAction
{
公共无效执行(IActor ANYONY){}
}
公共级保健药水:IAction
{
public void Perform(IHealthUser healthUserOnly){}
}

IAction
定义的合同规定,您可以
对任何
IActor
执行操作。任何人都可以。不仅
IHealthUser
。您的
HealthPotion
尝试只实现
IAction
的一个子集,这意味着只在
IActor
的一个子集上执行其任务。这不是
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){}
}
公共接口IAction,其中TAppliesTo:IActor
{
无效执行(Tapplies to appliesTo);
}
公共类通用性:IAction
{
公共无效执行(IActor ANYONY){}
}
公共级保健药水:IAction
{
public void Perform(IHealthUser healthUserOnly){}
}

@ZoharPeled“'HealthPotion'不实现成员'IAction.Perform(IActor)'@ZoharPeled”'HealthPotion'当然不实现成员'IAction.Perform(IActor)'!我被困在“IHealthUser是一个派生接口,它应该可以工作!”的心态中,而实际上我所做的是使IAction实现受到更大的限制。你说得很好,通用选项也很神奇。当然!我被困在“IHealthUser是一个派生接口,它应该可以工作!”的心态中,而实际上我所做的是使IAction实现受到更大的限制。你把它说得很好,而通用选项的效果很好。