我们正在使用一个对 3D 测量数据执行计算的类库,它公开了一个方法:
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
时没有使用它?