1

私はこれを持っています:

public IClub GetTeam()
{
    return new Arsenal();
}
//compiles since Arsenal is an IClub

public T GetTeam<T>() where T : IClub, new()
{
    return new Arsenal();
}
//wouldn't compile saying "cannot convert Arsenal to T"

しかし、これらのことはうまくいきます:

public T GetTeam<T>() where T : IClub, new()
{
    T t = new T();
    t.Sponsor = "Nike"; //since it knows T is IClub,
    return new T();     //but why the injustice to return type alone?
}
  1. 戻り値の型が とにかく であるにもかかわらず、2 番目のコード ブロックがコンパイルされないのはなぜIClubですか? それは不公平ではありませんか?

  2. 上記のコードで型制約の可能性を十分に活用していないことはわかっていますが、コードを実行するための代替手段は何ですか?

4

2 に答える 2

1

T はコンパイル時に不明な型であり、コンパイラはある型から別の型にキャストできるかどうかを知る方法がないため、その型へのキャストを明示的に呼び出します。

return (T)(object)(new Arsenal());

このようにして、コンパイラは Arsenal をオブジェクトとしてキャストできること、およびそのオブジェクトを T としてキャストできることを確実に認識します。キャストが無効な場合はランタイム アサートを取得しますが、正しくキャストするとコンパイルされて正常に動作します。

T を IClub に制約すると、なぜ T が不明なのですか? どのタイプでもこのインターフェースを実装できるためです。Arsenal を返そうとしますが、別のクラス、たとえば "Car : IClub" も IClub を実装しています。この場合、T は Car である可能性がありますが、コンパイラは、Arsenal が Car にキャストできることを証明する方法がありません... または、実際の ID ではなく、実装するインターフェイスのみを知っているため、他のクラス.

于 2012-10-18T06:21:11.230 に答える
1

Arsenalこれは、コンパイル時に、コンパイラが に変換できるかどうかわからないためTです。結局のところ、T実装する別のタイプである可能性があります。IClubのようにGetTeam<WhateverTeam>()WhateverTeamを実装IClubしていますが、それに変換することはできませんArsenal

コードをコンパイルする場合は結果をキャストする必要がありますが (Marc-André の回答のように)、設計を再考する必要があります (呼び出すGetTeam<WhateverTeam>()と例外が発生します)。返される型がすでにわかっている場合、そのメソッドをジェネリックにすることは意味がありません。

于 2012-10-18T06:21:20.543 に答える