4

このコードで:

for (int row = 0; row < PlatypusGridRowCount; row++) {
    // Save each row as an array
    var currentRowContents = new string[ColumnCount];
    // Add each column to the currentColumn
    for (int col = 0; col < ColumnCount; col++) {
        currentRowContents[col] = this.GetPlatypusValForCell(row, col);
}
// Add the row to the DGV
dataGridViewPlatypus.Rows.Add(currentRowContents);

Resharperは最後の行について次のように述べています。「string[]からobject[]への共変配列変換は、書き込み操作で実行時例外を引き起こす可能性があります」

そこで、コードが次のようになるように、必要な変更を加えます("ローカル変数のタイプをobject[] ..."に変更します)。

...
    object[] currentRowContents = new string[ColumnCount];
...

次に、Resharper検査を再実行すると、Resharperからまったく同じ正確な警告メッセージが再度表示されます(「string[]からobject[]への共変配列変換により、書き込み操作で実行時例外が発生する可能性があります」)が、今回は行:

object[] currentRowContents = new string[ColumnCount];

次に、その処理を再度実行します("ローカル変数の型をstring[] ...に変更します)

...したがって、これによりその行が次のように変更されます。

string[] currentRowContents = new string[PLATYPUS_COL_COUNT];

...(IOW、最初のバージョンに戻しますが、暗黙的な文字列配列宣言ではなく明示的な文字列配列宣言を使用します); しかし、その後ReSharperを実行すると、string[]をvarなどに変更する必要があります。

4

3 に答える 3

5

配列を使用してコードからデータを取得している間、コードは完全に完璧です。

残念ながら、ReSharperはその配列への書き込みがあるかどうかを検出できず(グローバルプログラム検証は現時点ではコンピュータサイエンスの未解決の問題です:))、配列要素に割り当てがある場合、プログラムは実行時に例外をスローします。文字列以外のものが割り当てられています。

于 2012-08-28T10:02:57.470 に答える
3

私はそれが欲しいと思います

object[] currentRowContents = new object[ColumnCount]

object []を期待するものにstring[]を指定した場合、その何かがその配列に任意のオブジェクトを割り当てることは合法です。したがって、コードはコンパイル時に有効ですが、実行時に例外をスローする可能性があります(文字列以外のものが配列要素に割り当てられた場合)。

于 2012-08-27T23:16:33.210 に答える
2

currentRowContentsが文字列配列である他の理由がない場合は、それを宣言するだけでvar currentRowContents = new object[ColumnCount];、共変配列変換を排除できます。

**または、ハチェットの答えを読んでください。これは私のものと同じですが、より速いタイピストによって書かれています;)

于 2012-08-27T23:20:44.147 に答える