【发布时间】:2012-04-19 14:12:21
【问题描述】:
我们正在使用一个对 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 声明了类库方法,则可以同时使用数组和@987654328 调用该方法@:
MeasurementResults Calculate(IEnumerable<IEnumerable<Measurement>> data)
我怀疑还有一些编译器技巧在起作用,我想知道为什么他们没有让IList 与List 一起工作?
【问题讨论】:
-
使用
T[][]调用IList<IList<T>>方法可以工作,因为数组协方差损坏。它被破坏了,因为编译器允许您将List<T>分配给IList<IList<T>>的元素,但如果该对象确实是T[][],则分配将在运行时失败。 -
@phoog:啊哈,有趣,不知道。
标签: c# .net generics ienumerable ilist