【问题标题】:How can I avoid this potential "run-time exception on write operation"?如何避免这种潜在的“写操作运行时异常”?
【发布时间】:2012-08-22 10:54:41
【问题描述】:

使用此代码:

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[] currentRowContents = new string[ColumnCount];
...

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

object[] currentRowContents = new string[ColumnCount];

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

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

string[] currentRowContents = new string[PLATYPUS_COL_COUNT];

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

【问题讨论】:

    标签: c# arrays winforms resharper


    【解决方案1】:

    我认为它想要

    object[] currentRowContents = new object[ColumnCount]
    

    如果您将字符串[] 赋予期望对象[] 的对象,则该对象将任何对象分配到该数组中是合法的。因此,您的代码在编译时是合法的,但在运行时可能会引发异常(如果将字符串以外的内容分配给数组元素)。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-20
          • 2011-01-27
          • 1970-01-01
          • 2015-12-11
          • 2012-10-03
          • 2015-11-25
          • 1970-01-01
          • 2010-12-06
          相关资源
          最近更新 更多