代码检查:协变数组转换
C# 允许您将派生类型的数组引用为基类型的数组。 正如 Eric Lippert 的文章中所解释的,这种设计既有其优点也有其问题。 说到问题,让我们看一下下面的示例。 当我们将 string[] myStrings 传递给 ChangeFirstItem(object[] myArray) 时,我们仍然有一个字符串数组,而不是对象数组。 因此,当我们尝试将一个 int 值分配给数组的第一个元素时,会在运行时得到 ArrayTypeMismatchException。 JetBrains Rider 在此检测到问题并发出警告。
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
}
有几种方法可以修复此类问题。 JetBrains Rider 提供了 快速修复 ,或者将初始数组的类型更改为基类型的数组,或者将接受参数的类型更改为派生类型的数组。
除了这两种修复方法,您还可以使用 ToArray<T>() 方法,例如: myStrings.ToArray<object>()。 请注意,此修复在上述示例中不起作用,因为 ToArray<T>() 将创建数组的副本。
最后修改日期: 2025年 9月 26日