在类型约束的泛型方法中,无法将类型转换为接口实例?

时间:2013-03-23 13:38:18

标签: c# .net generics interface

为什么这会给我一个编译时错误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(); 
}

2 个答案:

答案 0 :(得分:4)

此演员表不安全,因为您可以为ListCompetitions提供与TOperation不同的通用参数,例如您可以:

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();
}

在这种情况下,不清楚使用泛型的好处是什么。

答案 1 :(得分:1)

由于TOperation可以实施IOperation的任何,因此您无法确定ListCompetitionsTOperation

您可能想要返回IOperation:

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