为了账号安全,请及时绑定邮箱和手机立即绑定

方法泛型不同的接口

方法泛型不同的接口

C#
富国沪深 2023-09-16 17:55:06
为什么我不能将泛型方法与这样的接口一起使用?我的参数的接口public interface IBaseParam {    string Name { get; }}public interface IComplexParam : IBaseParam {    string P1 { get; }    string P2 { get; }}使用泛型接口的类public interface ILauncherCommand {    void launch<T>(T parameters) where T : IBaseParam;}public class BaseCommand : ILauncherCommand {    string Name { get; }    public void launch<T>(T parameters) where T : IBaseParam {    }}public class ComplexCommand : ILauncherCommand {    string Name { get; }    public void launch<T>(T parameters) where T : IComplexParam {    }}ComplexCommand.launch是编译器显示问题的地方(CS0425)。IComplexParam继承自IBaseParam,因此契约必须有效。仅当声明泛型类时我才能编译,但我想使用泛型方法而不是完整的泛型类下面的代码可以工作,但它是一个泛型类public interface ILauncherCommand<T> where T : IBaseParam {    void launch(T parameters);}public class BaseCommand : ILauncherCommand<IBaseParam> {    string Name { get; }    public void launch(IBaseParam parameters) {    }}public class ComplexCommand : ILauncherCommand<IComplexParam> {    string Name { get; }    public void launch(IComplexParam parameters) {    }}
查看完整描述

1 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

泛型方法强制您使用不变类型,这意味着您必须准确提供您指定的内容。


您正在寻找的是启用协方差类型以允许使用更多派生类型。这只能在类级别完成:


请注意,这<in T>是指定协方差的方式。


public interface ILauncherCommand<in T> where T : IBaseParam

{

    void launch(T parameters);

}


public class BaseCommand<T> : ILauncherCommand<T> where T : IBaseParam  

{

    string Name { get; }


    public void launch(T parameters)

    {

    }

}


public class ComplexCommand<T> : ILauncherCommand<T> where T : IComplexParam

{

    string Name { get; }


    public void launch(T parameters)

    {

    }

}

在这种特定情况下,请注意 是<in >可选的,因为协方差是自动的。


查看完整回答
反对 回复 2023-09-16
  • 1 回答
  • 0 关注
  • 51 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信