我认为我的问题最好用我的类/接口层次结构的代码片段来解释:
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:为什么在第二种情况下s1.Transform(v)
resolve toITransform<ISelection>
而不是to ?ITransform<IValue>
问题 2:ITransform
对于问题 1,如果is<D>
或似乎没有区别<in D>
。<in D>
但是您是否看到在我的类/界面层次结构中使用的任何其他问题?我有点怀疑,因为ISelector
哪个实现ITransform<IValue>
和ITransform<ISelection>
. IValue
由于继承,逆变可能会在这里引起任何问题ISelection
吗?
编辑 只是为了让您知道:我目前正在使用 Silverlight 4,但我认为这是一般的 C# 行为。