Проблема не связана с методами расширения. Учитывая определения из вашего примера, следующие ошибки приводят к ошибке компилятора:
void DoStuff(List<ICar> cars)
{
}
DoStuff(new List<Car>());
Проблема в том, что, хотя элементы List<Car>
реализуют ICar
, тип List<Car>
нельзя использовать в местах, где ожидается List<ICar>
.
В примере вы можете использовать
var x = new List<ICar>();
x.OnlyAuto();
или добавьте следующий метод расширения:
public static IEnumerable<ICar> OnlyAuto(this IEnumerable<ICar> cars)
{
return cars.Where(x => x.Tranny == Transmission.Automatic).ToList();
}
и используйте Cast:
var x = new List<Car>();
(x.Cast<ICar>()).OnlyAuto();
Если вы ищете в Google "C # covariance", вы обнаружите, что многие люди писали об этой проблеме. И кажется, что в c # 4.0 IEnumerable является ковариантным, что означает, что вы можете исключить использование Cast
в приведенном выше примере.