我们正在使用一个类库,对三维测量数据进行计算,它公开了一个方法:
MeasurementResults Calculate(IList<IList<Measurement>> data)
我希望允许使用任何可索引的列表(当然是由Measurement组成的列表)调用此方法,例如:
Measurement[][] array;
List<List<Measurement>> list;
使用数组调用该方法是有效的,这有点奇怪。这里是否有一些编译器技巧在起作用?而试图使用 List
调用则会出现熟悉的错误:
cannot convert from 'List<List<Measurement>>' to 'IList<IList<Measurement>>'
因此,我编写了一个Facade类(包含其他内容),其中包含一种将通用定义分割为参数和方法并在必要时转换为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
搭配使用?
T[][]
调用IList<IList<T>>
方法是可行的,因为存在破碎的数组协变性。这种协变性是破碎的,因为编译器允许将List<T>
分配给IList<IList<T>>
的元素,但如果对象实际上是T[][]
,则分配将在运行时失败。 - phoog