使用具有复杂索引的多维数组是很常见的情况。当所有索引都是整数时,这确实令人困惑且容易出错,因为您可以轻松地混淆列和行(或您拥有的任何内容)并且编译器无法识别问题。实际上应该有两种类型的索引:行和列,但它不是在类型级别上表示的。
这是我想要的一个小例子:
var table = new int[RowsCount,ColumnsCount];
Row row = 5;
Column col = 10;
int value = table[row, col];
public void CalcSum(int[,] table, Column col)
{
int sum = 0;
for (Row r = 0; r < table.GetLength(0); r++)
{
sum += table[row, col];
}
return sum;
}
CalcSum(table, col); // OK
CalcSum(table, row); // Compile time error
加起来:
- 应静态检查索引是否混淆(类型检查)
- 重要的!它们应该是运行时高效的,因为将整数包装到包含索引的自定义对象然后将它们解包回来对性能来说是不合适的
- 它们应该可以隐式转换为整数,以便用作本机多维数组中的索引
有什么办法可以做到这一点?完美的解决方案类似于typedef
仅编译成平面整数的编译时检查。