我认为我的问题最好用我的类/接口(interface)层次结构的代码片段来解释:
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>
似乎没有什么区别。但是,您是否在类/接口(interface)层次结构中使用<in D>
看到其他任何问题?我有点怀疑,因为ISelector
实现了ITransform<IValue>
和ITransform<ISelection>
。因为IValue
继承了ISelection
,所以可能会在这里引起任何问题吗?编辑
只是让您知道:我目前正在使用Silverlight 4,但是我认为这是常规的C#行为。
最佳答案
您的Selector类实现了ITransform接口(interface),这意味着您必须包括处理Transform(ISelection)的代码。您的类也可以处理Transform(IValue),但只能从Editor类继承方法。
之所以选择ISelection变体,是因为这是在Selector类中显式声明的变体。要选择Transform(IValue),编译器必须假设您宁愿处理来自基类(编辑器)的调用。
编辑:从C#规范的一些背景。
关于c# - C#中的方法重载解析和通用/相反接口(interface),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9529943/