无法将类型转换为具有类型约束的泛型方法中接口的实例

本文关键字:约束 泛型方法 实例 接口 类型 类型转换 | 更新日期: 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的任何东西,所以不能确定ListCompetitionsTOperation

你可能想返回一个IOoperation:

public IOperation GetOperation<TOperation>() where TOperation : IOperation
{
    return new ListCompetitions(); 
}