方法泛型不同的接口

为什么我不能将泛型方法与这样的接口一起使用?


我的参数的接口


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) {


    }

}


富国沪深
浏览 84回答 1
1回答

RISEBY

泛型方法强制您使用不变类型,这意味着您必须准确提供您指定的内容。您正在寻找的是启用协方差类型以允许使用更多派生类型。这只能在类级别完成:请注意,这<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 >可选的,因为协方差是自动的。
打开App,查看更多内容
随时随地看视频慕课网APP