Я думаю, что мою проблему лучше всего объяснить с помощью фрагмента кода моей иерархии классов / интерфейсов:
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>
. Но видите ли вы другие проблемы с использованием <in D>
в моей иерархии классов / интерфейсов? Я немного сомневаюсь из-за ISelector
, который реализует ITransform<IValue>
и ITransform<ISelection>
. Может ли это привести к противоречивости, потому что IValue
наследует ISelection
?
EDIT
Просто чтобы вы знали: в настоящее время я использую Silverlight 4, но я думаю, что это общее поведение C #.