2015-10-20 3 views
2

У меня есть общий тип параметров в моих классах. Почему я могу это сделать:Общий параметр интерфейса левой стороны

BaseFoo<InterfaceImplementation> foo = new ChildFoo<InterfaceImplementation>(); 

Но не это? Не следует ли компилятору выяснить, что AnInterface - это реализация InterfaceImplementation?

BaseFoo<AnInterface> foo = new ChildFoo<InterfaceImplementation>(); 

Я надеялся, чтобы быть в состоянии сделать что-то вроде этого:

BaseFoo<AnInterface> foo = new ChildFoo<InterfaceImplementation>(); 
BaseFoo<AnInterface> bar = new ChildFoo<AnotherInterfaceImplementation>(); 

Если обе реализации имеют общий интерфейс.

+3

Преобразование 'BaseFoo' в интерфейс и использование [Co- и Contravariance] (https://msdn.microsoft.com/en-us/library/ee207183.aspx). –

+1

Что-то вдоль линии «Оранжевый - это плод, но вы не можете обращаться с корзиной с апельсинами как с корзиной фруктов, так как после этого вы можете добавить банан в корзину», но почему-то я всегда ошибаюсь в метафоре. – Maarten

ответ

1

Тот факт, что

class A {} 
class B : A {} 

не означает, что

class C<B> : C<A> {} 

Вам необходимо дисперсию, но в C# это работает только с интерфейсами и делегатами.
Вы можете объявить вариант интерфейса и выбрать из совместного и контрвариации:

IBaseFoo<out T> {} // this is covariant interface 
IBaseFoo<in T> {} // this is contravariant interface 

Смотреть еще here.

Смежные вопросы