为什么我不能将泛型方法与这样的接口一起使用?我的参数的接口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 >可选的,因为协方差是自动的。
- 1 回答
- 0 关注
- 83 浏览
添加回答
举报
0/150
提交
取消