(Я проверил бы это для меня, но у меня (еще) нет VS2010),
Скажите, что у меня есть 2 основных интерфейса:
IBaseModelInterface
IBaseViewInterface
И 2 интерфейса, понимающие их:
ISubModelInterface : IBaseModelInterface
ISubViewInterface : IBaseViewInterface
Если я определяю a Tuple<IBaseModelInterface, IBaseViewInterface>
Я хотел бы установить это на основе результата фабрики, которая возвращается Tuple<ISubModelInterface, ISubViewInterface>
.
В C# 3 я не могу сделать этого даже при том, что интерфейсы sub понимают основные интерфейсы. И я - вполне уверенный C# 4, позволяет мне сделать это, если я использовал IEnumerable<IBaseModelInterface>
потому что это теперь определяется с in
ключевое слово для разрешения ковариантности. Делает Tuple
позвольте мне делать это?
Из того, что (мало) я понимаю, ковариантность только позволяется в интерфейсах, делает это означает там потребности быть ITuple<T1, T2>
интерфейс? Это существует?
Кортеж
— это класс (ну, семейство классов) — он инвариантен по определению. Как вы упоминали далее, только интерфейсы и типы делегатов поддерживают общую дисперсию в .NET 4.
Я не знаю интерфейса ITuple
. Может быть один, который будет ковариантным, так как кортежи неизменяемы, поэтому вы получаете значения только «из» API.