为什么这会给我一个编译时错误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();
}
答案 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
的任何,因此您无法确定ListCompetitions
是TOperation
。
您可能想要返回IOperation:
public IOperation GetOperation<TOperation>() where TOperation : IOperation
{
return new ListCompetitions();
}