我认为我的问题最好用我的类/接口层次结构的代码片段来解释:
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# 行为。