複雑なインデックス付けで多次元配列を使用するのはかなり一般的なケースです。すべてのインデックスが int であると、列と行 (またはあなたが持っているもの) を簡単に混同することができ、コンパイラが問題を特定する方法がないため、非常に混乱し、エラーが発生しやすくなります。実際には、行と列の 2 種類のインデックスが必要ですが、型レベルでは表現されません。
ここに私が欲しいものの小さなイラストがあります:
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
要約:
- インデックスが混同されていないか静的にチェックする必要があります (一種の型チェック)
- 重要!int をインデックスを含むカスタム オブジェクトにラップしてからアンラップするのはパフォーマンスに問題があるため、実行時に効率的である必要があります。
- ネイティブの多次元配列でインデックスとして機能するために、暗黙的に int に変換できる必要があります。
これを達成する方法はありますか?typedef
完璧な解決策は、プレーンintにコンパイルするだけのコンパイル時のチェックとして機能するようなものです。