私の問題は、私のクラス/インターフェース階層のコードスニペットで最もよく説明されていると思います:
public interface ITransform<D> // or <in D> --> seems to make no difference here
{
void Transform(D data);
}
interface ISelection {}
interface IValue : ISelection {}
public interface IEditor : ITransform<IValue> {}
public interface ISelector : IEditor, ITransform<ISelection> {}
class Value : IValue { ... }
class Editor : IEditor { ... } // implements ITransform<IValue>
class Selector : Editor, ISelector { ... } // implements ITransform<ISelection>
Value v = new Value();
Selector s1 = new Selector();
ISelector s2 = s1;
s1.Transform(v); // resolves to ITransform<ISelection> --> WHY?
s2.Transform(v); // resolves to ITransform<IValue> --> OK
質問 1: 2 番目のケースのように に解決され、s1.Transform(v)
解決されITransform<ISelection>
ないのはなぜですか?ITransform<IValue>
質問 2:ITransform
質問 1 では、 が であるかである<D>
かに違いはないようです<in D>
。<in D>
しかし、私のクラス/インターフェース階層での使用に他に問題はありますか? どちらのISelector
実装ITransform<IValue>
とITransform<ISelection>
. IValue
継承するため、ここで反変性が問題を引き起こす可能性がありますISelection
か?
EDIT お知らせ: 現在、Silverlight 4 を使用していますが、これは一般的な C# の動作だと思います。