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

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

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

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

object[] currentRowContents = new string[ColumnCount];

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

...因此,这会将该行更改为:

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]

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

于 2012-08-27T23:16:33.210 回答
2

If you have no other reason for currentRowContents to be a string array, you can just declare it as var currentRowContents = new object[ColumnCount]; thus eliminating the co-variant array conversion

**or just read hatchet's answer, which is the same as mine but written by a faster typist;)

于 2012-08-27T23:20:44.147 回答