无法将类型转换为具有类型约束的泛型方法中接口的实例
本文关键字:约束 泛型方法 实例 接口 类型 类型转换 | 更新日期: 2023-09-27 18:05:21
为什么这会给我一个编译时错误Cannot convert 'ListCompetitions' to 'TOperation'
:
public class ListCompetitions : IOperation
{
}
public TOperation GetOperation<TOperation>() where TOperation : IOperation
{
return (TOperation)new ListCompetitions();
}
然而,这是完全合法的:
public TOperation GetOperation<TOperation>() where TOperation : IOperation
{
return (TOperation)(IOperation)new ListCompetitions();
}
此强制转换不安全,因为您可以为TOperation
提供不同于ListCompetitions
的泛型参数,例如,您可以具有:
public class OtherOperation : IOperation { }
OtherOperation op = GetOperation<OtherOperation>();
如果编译器允许您的方法,那么它将在运行时失败。
您可以添加一个新的约束,例如
public TOperation GetOperation<TOperation>() where TOperation : IOperation, new()
{
return new TOperation();
}
或者,您可以将返回类型更改为IOperation
:
public IOperation GetOperation()
{
return new ListCompetitions();
}
从您的例子来看,在这种情况下使用泛型的好处还不清楚。
因为TOperation
可以是实现IOperation
的任何东西,所以不能确定ListCompetitions
是TOperation
。
你可能想返回一个IOoperation:
public IOperation GetOperation<TOperation>() where TOperation : IOperation
{
return new ListCompetitions();
}