如何避免这种潜在的“写操作运行时异常”?

时间:2012-08-27 22:53:09

标签: c# arrays winforms resharper

使用此代码:

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谈到最后一行:“从字符串[]到对象[]的共变量数组转换会导致写入操作的运行时异常”

所以我让它进行它想要的更改(“将局部变量的类型更改为object [] ...”)以便代码变为:

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

然后,当我重新运行Resharper检查时,我再次从Resharper获得完全相同的确切警告消息(“从字符串[]到对象[]的共变量数组转换可能导致写入操作的运行时异常”),但这一次就行了:

object[] currentRowContents = new string[ColumnCount];

然后让它再次做它的事情(“将局部变量的类型改为字符串[] ......”)

...所以这会将该行更改为:

string[] currentRowContents = new string[PLATYPUS_COL_COUNT];

...(IOW,它将其更改回第一个版本,但使用显式而非隐式字符串数组声明);但随后的ReSharper运行会要求我将string []更改为var等等。

3 个答案:

答案 0 :(得分:5)

当数组用于从中检索数据时,您的代码绝对完美。

不幸的是,ReSharper无法检测是否有对该数组的写入(此时计算机科学中的全局程序验证尚未解决问题:)),如果有数组元素的赋值,程序将在运行时抛出异常-time如果分配了除字符串之外的其他内容。

答案 1 :(得分:3)

我认为它想要

object[] currentRowContents = new object[ColumnCount]

如果你给一个需要一个对象[]的东西给一个字符串[],那么将任何对象分配到该数组中是合法的。因此,您的代码在编译时是合法的,但在运行时可能会抛出异常(如果字符串以外的其他内容被分配给数组元素)。

答案 2 :(得分:2)

如果currentRowContents没有其他原因成为字符串数组,则可以将其声明为var currentRowContents = new object[ColumnCount];,从而消除共变数组转换

**或者只是阅读斧头的答案,这与我的相同,但是由更快的打字员写的;)