5

次のコンパイルを行わなくても可能です。

  1. ジェネリックIFooCollectionにする
  2. 明示的に実装IFooCollection.ItemsFooCollection、明示的なキャストを実行します。

public interface IFoo
{

}

public interface IFooCollection
{
    IEnumerable<IFoo> Items { get; }
}

public class FooCollection<T> : IFooCollection where T : IFoo
{
    public IEnumerable<T> Items { get; set; }
}

2番目のソリューション(インターフェイスを明示的に実装する)には十分満足していますが、を実装する必要があることを指定する一般的な制約がある場合のようにキャストする必要がある理由を理解したいと思いTます。IFooTIFoo

4

1 に答える 1

9

その理由は次のとおりです。

IFooCollection.Itemsを実装する任意のクラスを含めることができますIFooFooAしたがって、、、FooBFooC同時に含めることができます。

FooCollection<FooA>.Items一方、タイプの要素のみを含めることができますFooA。キャストしようとすると、すべてが実装されますが、FooB生成されます。FooCFooAInvalidCastExceptionIFoo

于 2012-08-31T11:17:58.293 に答える