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

C# resharper协变数组转换-矛盾修复,c#,arrays,resharper,warnings,C#,Arrays,Resharper,Warnings,我有以下代码: 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 conver

我有以下代码:

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;other;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]行中的“字符串[]”改为“对象[]”。但现在,它给了我同样的警告,我的评论行[1]。自动修复会产生以前的代码,因此它基本上是一个非常烦人的循环


我不想用注释来禁用警告,因为我通常认为这是一种懒惰和糟糕的方法。但我看不到任何其他方法来解决这个问题。我的代码是否有问题?有没有一种方法可以在不抑制或忽略警告的情况下修复此问题?

如果您的目标是删除该警告消息,那么更改第一行以生成对象数组而不是字符串就足够了

object[] newRow = row[0].ToString().Split(';').Cast<object>().ToArray();
R#没有能力区分这两种情况。你得到的警告在数学上完全正确。另一方面,作为开发人员,您知道它不会导致此警告的问题,因为您比R#更了解代码。最好接受这样的想法,即您是代码的主宰,而R#只是有用的提示源,而不是相反

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

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

鉴于我们知道那里发生了什么,我们知道这没问题(您可以在这里查看DataTable.cs: 并且确保当
Add(object[]params))
没有像前面提到的那样修改输入数组时不会出现问题,但是R#不知道这条信息

换了我以后,你再也不演那个角色了。您正在获取一个字符串数组,通过逐个向对象强制转换,您正在创建一个全新的数组,而不仅仅是以前数组的不同类型标识。希望这会有所帮助,而不是混淆


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

事实上,它是。Split在返回字符串的同时返回行。Add只接受对象数组。我现在正在使用最新的R#Ultimate查看这一点,如果您按照Smogen的描述进行操作,您会得到前面提到的消息。不确定测试的版本。@HimBromBeere您必须阅读文本。第二个版本的修复将第一个版本的类型更改为
object[]
。啊,我得到了Juharr的评论。遗憾的是,这不是我想要的。这只是另一种压制警告的方式,即使在技术上没有评论,但对我来说,这基本上是一样的:我隐藏了问题,我没有解决它。谢谢你的回答!是的,现在我明白了。你是对的。我想我会用一句话来压制它,因为,既然你这么说,我觉得这是处理它的正确方式。毕竟,正如你所说,做我所做的事情并不是“错误的”。非常感谢。
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);