ReSharper 2025.2 Help

代码检查:协变数组转换

C# 允许您将派生类型的数组引用为基类型的数组。 正如在 Eric Lippert 的文章中所解释的,这种设计既有其优点也有其问题。 说到问题,让我们看一下下面的示例。 当我们将 string[] myStrings 传递给 ChangeFirstItem(object[] myArray) 时,我们仍然拥有一个字符串数组,而不是对象数组。 因此,当我们尝试将一个 int 值分配给数组的第一个元素时,会在运行时得到 ArrayTypeMismatchException。 ReSharper 在此检测到问题并发出警告。

void Test() { string[] myStrings = { "one","two","three" }; ChangeFirstItem(myStrings); //Co-variant array conversion can cause runtime exception... Console.WriteLine(myStrings[0]); } void ChangeFirstItem(object[] myArray) { myArray[0] = 10; //ArrayTypeMismatchException at runtime }

有几种方法可以修复此类问题。 ReSharper 提供了 快速修复 ,或者将初始数组的类型更改为基类型的数组,或者将接受参数的类型更改为派生类型的数组。

除了这两种修复方法,您还可以使用 ToArray<T>() 方法,例如: myStrings.ToArray<object>()。 请注意,此修复在上述示例中不起作用,因为 ToArray<T>() 将创建数组的副本。

最后修改日期: 2025年 9月 27日