Разрешение перегрузки метода и общие / контравариантные интерфейсы в C #

Думаю, мою проблему лучше всего объяснить с помощью фрагмента кода моей иерархии классов / интерфейсов:

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 , а не ITransform , как во втором случае?

Вопрос 2: Для Вопроса 1, похоже, не имеет значения, если ITransform - это или <в D> . Но видите ли вы какие-либо другие проблемы с использованием <в D> в моей иерархии классов / интерфейсов? Я немного сомневаюсь из-за ISelector , который реализует ITransform и ITransform . Может ли контравариантность вызвать здесь какие-либо проблемы, потому что IValue наследует ISelection ?

EDIT Просто чтобы вы знали: в настоящее время я использую Silverlight 4, но я думаю, что это обычное поведение C #.

7
задан Stephan 2 March 2012 в 09:13
поделиться