0

私は2つのインターフェースを持っています、

public interface IDocument<SegType> where SegType : ISegment

public interface ISegment

IDocument基本的に、実装する各クラスが の 1 つのタイプで構成されていること、およびこれらのクラスを使用するユーザーが内部で使用しているクラスISegmentのタイプを知る必要がないことを強制したいと考えています。ISegment

次に、次を実装するクラスを作成しましたIDocument<SegType> where SegType : ISegment

public class MyDocument : IDocument<MySegment>

および対応するMySegment:

public class FffSegment : ISegment

これらはすべて、型として指定したときに期待どおりにコンパイルされ、機能しますMyDocumentMyDocumentのインスタンスをの型に暗黙的にキャストできないのはなぜIDocument<Isegment>ですか? 私が行を試すとき:

IDocument<ISegment> doc = new MyDocument();

エラーが発生します

Cannot implicitly convert type 'MyDocument' to 'IDocument<ISegment>'. An explicit conversion exists (are you missing a cast?)

しかし、キャストすると、null が返されます。それを次のように変更すると:

IDocument<MySegment> doc = new MyDocument();

クラス定義を次のように変更した場合と同様に機能します

public class MyDocument : IDocument<ISegment>

IDocument の実装に ISegment を実装する特定の型を強制できないのはなぜですか? 私はこのコードをさまざまなタイプの に再利用したいと考えてIDocumentおりISegment、いつの日かいくつかの の実装でIDocument複数のタイプの を許可するようになりますがISegmentMyDocumentこの種の動作に対しては制限する必要があります。これらの要件を強制しながら、将来再利用できる汎用性のあるコードを作成するにはどうすればよいでしょうか?

4

2 に答える 2

3

共反分散の厄介さを理解する必要があります。

public interface IDocument<out SegType> where SegType : ISegment
{}

私はあなたの例を今すぐコンパイルするべきだと思います...

ここにいくつかの読み物があります:

于 2013-03-01T21:53:10.040 に答える
0

IDocument<MySegment>に直接キャストできないためIDocument<ISegment>です。可能であれば、これを行うことができます:

IDocument<ISegment> doc1 = new IDocument<MySegment>;
doc1.Add(new MyOtherSegment());   // invalid

(メソッドIDocument<T>があると仮定)Add(T newSegment)

設計をよく見て、ジェネリックが本当に必要なのか、それとも内部で使用するだけISegmentIDocument十分なのかを判断してください。

于 2013-03-01T21:55:17.660 に答える