我认为我的问题最好用我的类/接口(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/

10-10 19:09