gpt4 book ai didi

c# - resharper 协变数组转换 - 矛盾修复

转载 作者:太空宇宙 更新时间:2023-11-03 23:06:35 25 4
gpt4 key购买 nike

我有以下代码:

private static DataTable MyMethod(DataTable oneColDataTable)
{
DataTable result = new DataTable();

foreach (DataRow row in oneColDataTable.Rows)
{
string[] newRow = row[0].ToString().Split(';'); // [1] Co-variant array conversion when object[]

while (newRow.Length > result.Columns.Count)
{
result.Columns.Add(new DataColumn());
}

result.Rows.Add(newRow); // [2] Co-variant array conversion
}

return result;
}

此代码的功能

我在这里所做的是获取一个只有一列的数据表。在那个专栏中,我在多行中有这样的内容:“This;Is;the;first;row” - “This;Is;another;row;that;has;more;words”;我拆分此信息,然后将单词解释为该行的列值。基本上将其转换为多行表格,如下所示:

Content of my DataTable:
|This|Is|the |first|row | | | |
|This|Is|another|row |that|has|more|words|

协变数组转换 - 问题

ReSharper 在评论 [2] 中警告我有关“协变数组转换”的信息。 resharper 的自动修复将注释行 [1] 中的“string[]”变为“object[]”。但现在它给了我相同的注释行警告 [1]。自动修复它会导致它以前的代码,所以它基本上是一个非常烦人的循环。

我不想通过评论禁用警告,因为我通常认为这是一种懒惰和糟糕的方法。但我没有看到任何其他方法来解决这个问题。我在我的代码中做错了什么吗?有没有办法在不抑制或忽略警告的情况下解决这个问题?

最佳答案

如果您的目标是删除该警告消息,只需更改第一行以生成对象数组而不是字符串。

object[] newRow = row[0].ToString().Split(';').Cast<object>().ToArray();

但是接下来的问题是,在枚举假定的新行期间是否真的有必要设计表的结构,或者甚至为了摆脱消息而进行的这种更改是否可能会花费您在 Cast<> 上花费的一些性能。和枚举

编辑:问题是没有真正的问题需要解决。您收到警告说某些事情可能 会发生。认识到 R# 警告并不意味着它肯定是错误也很好,它让你知道你应该关心那部分。

想象一下:

public static object[] GetTuples()
{
return new Tuple<string, int>[10]; // R# warning here
}
public static void Test()
{
object[] tuples = GetTuples();
tuples[0] = new Tuple<string, int>("", 1);
tuples[1] = ""; // this will crash process, but no R# Warnings here
}

与您描述的场景相比:

string[] parts = "some;string".Split(",");
table.Rows.Add(parts);

R# 无法区分这两种情况。您收到的警告在数学上是完全正确的。另一方面,作为开发人员,您知道它不会导致此警告针对的问题,因为您比 R# 更了解该代码。最好采用您是代码的主人,而 R# 只是有用的提示来源的想法,反之亦然。

这是完全正常的企业代码,在开发人员知道它是安全的同时愿意在代码库的其他部分启用它的地方包含 R# 抑制。

作为第二次编辑:我发布的代码实际上并没有隐藏任何(甚至是虚拟的)问题。它从“类型系统的角度”改变了发生的事情,虽然听起来几乎一样,但有点“大不同”:最初你已经创建了 string[] - 例如一些能够存储字符串的实体然后,您将此数组传递给需要 object[] 的方法并用它做点什么。这意味着从 string[] 转换至 object[]会发生。在程序中,这意味着我给你对象 [],你可以在那里存储任何 System.object(例如,从那里继承的所有东西),但正如所解释的那样,这不是真的。

鉴于我们知道那里发生了什么,我们知道它没问题(您可以在此处检查 DataTable.cs:https://referencesource.microsoft.com/#System.Data/System/Data/DataTable.cs并确保在 Add(object[] params)) 时不会有问题不会像前面提到的那样修改输入数组 - 但 R# 不知道这条信息。

在我的改变之后,你不再做那个转换了。您正在获取字符串数组,并通过将一个对象一个一个地转换为您正在创建全新数组的对象——而不仅仅是您之前数组的不同类型标识。希望这会有所帮助而不是混淆。

顺便说一句。另一个适当的解决方案是禁用这种警告,但这不是最好的方法:)

关于c# - resharper 协变数组转换 - 矛盾修复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41017694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com