Общий список списков, преобразующий List> в IList>

Мы используем библиотеку классов, которая выполняет вычисления на данных трехмерных измерений, это предоставляет метод:

MeasurementResults Calculate(IList<IList<Measurement>> data)

Я хотел бы разрешить вызов этого метода с любым индексируемым списком списков (Измерение, конечно ), например оба:

Measurement[][] array;
List<List<Measurement>> list;

Вызов метода с использованием массива работает нормально, что немного странный. Есть ли здесь какая-то хитрость компилятора?Попытка вызова с помощью Listприводит к знакомой ошибке:

cannot convert from 'List<List<Measurement>>' to 'IList<IList<Measurement>>'

Итак, я написал фасадный класс (, содержащий также некоторые другие вещи )с методом, который разделяет общее определение между аргументом и методом и при необходимости преобразуется в тип IList:

MeasurementResults Calculate<T>(IList<T> data) where T : IList<Measurement>
{
  IList<IList<Measurement>> converted = data as IList<IList<Measurement>>;
  if(converted == null)
    converted = data.Select(o => o as IList<Measurement>).ToList();
  return Calculate(converted);
}

Это хороший способ решить проблему или у вас есть идея получше?

Кроме того, при тестировании различных решений проблемы я обнаружил, что если метод библиотеки классов был объявлен с IEnumerableвместо IList, можно вызывать метод, используя как массив, так и List:

MeasurementResults Calculate(IEnumerable<IEnumerable<Measurement>> data)

. ] Я подозреваю, что здесь снова работает какой-то трюк с компилятором, интересно, почему они не заставили IListработать с List, пока они этим занимались?

6
задан Anlo 19 April 2012 в 14:35
поделиться