Мы используем библиотеку классов, которая выполняет вычисления на данных трехмерных измерений, это предоставляет метод:
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
, пока они этим занимались?