0

これによりコンパイル時エラーが発生するのはなぜですか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(); 
}
4

2 に答える 2

4

ListCompetitionsforとは異なる一般的な引数を指定できるため、このキャストは安全ではありません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();
}

あなたの例から、この場合にジェネリックを使用する利点が何であるかは明らかではありません。

于 2013-03-23T13:39:13.303 に答える
1

を実装するものは何でもTOperationかまいませんので、それが.IOperationListCompetitionsTOperation

おそらく IOperation を返したいでしょう:

public IOperation GetOperation<TOperation>() where TOperation : IOperation
{
    return new ListCompetitions(); 
}
于 2013-03-23T13:39:22.003 に答える