Вы должны помнить, что, хотя вы можете создать цепочку наследования (Row -> IEnumerable), нет надежного способа свернуть цепочку наследования.
Обратите внимание на следующее:
List<Row> rows = new List<Row>();
// Fill the list
IEnumerable<Row> rowsAsEnumerable = (IEnumerable<Row>)rows;
Rows realRows = (Rows)rowsAsEnumerable;
Так как rowAsEnumerable никогда не был объектом Rows
, как система будет обрабатывать приведение?
Ответ таков: это невозможно, потому что, хотя объект Rows всегда является IEnumerable, объект IEnumerable не всегда является объектом Rows.
Обновление
Поскольку мне не нравится быть разрушителем снов, я еще раз повторю то, что сказали другие.
Вы можете использовать простой метод Extension, чтобы сделать вещи немного чище из вашего примера:
public static Rows ToRows(this IEnumerable<Row> rowsAsEnum)
{
return new Rows(rowsAsEnum);
}
Теперь вы можете изменить свой звонок на:
Rows particularRows = rows.Where<Row>(row => condition).ToRows();