2016-12-09 7 views
1

なぜこのようなメソッドでは、戻り値の型を明示的にキャストする必要がありますか?制約付きの戻り値の型に明示的キャストが必要なのはなぜですか?

public T Test<T>() 
     where T : Response 
    { 
     var ret = new Response(); 

     return ret; // Explicit cast needed here 
    } 

制約を明示的にTが応答するかの子であることを述べ、その種類の多型を返すキャストせずにこれを許可する、またはそう私は思ったはずです。

as Tを追加すると、コンパイルが成功します。

+0

'T' _is_' Response'とサブタイプでない限り、実行時にキャストが失敗することに注意してください。 –

答えて

2

戻り値はTResponseであるかどうかは関係ありません。タイプTのものを返す必要があります。

タイプを考えてくださいDerivedFromResponseあなたのメソッドTest<DerivedFromResponse>()を使用するとnullがキャストで返され、ResponseDerivedFromResponseにキャストできないため、キャストなしでは機能しません(逆も可能です)。

希望します。

4

Tは、すべてのTResponseではなく、すべてのResponseTある意味、Responseのサブクラスです。これが明示的なキャストが必要な理由です。

関連する問題