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