解决数组和集合声明及初始化表达式中的错误和警告

本文介绍以下编译器错误:

  • CS0022:[] 内索引数错误,应为“number”
  • CS0178:级别说明符无效:应为“,”或“]
  • CS0248:无法创建大小为负值的数组
  • CS0270:不能在变量声明中指定数组大小(请尝试使用“new”表达式进行初始化)
  • CS0611:数组元素不能为 type
  • CS0623:数组初始值设定项只能在变量或字段初始化表达式中使用。请尝试改用新的表达式。
  • CS0650:数组声明符错误:要声明托管数组,级别说明符应位于变量的标识符之前。若要声明固定大小的缓冲区字段,请在字段类型之前使用 fixed 关键字。
  • CS0719:数组元素不能是静态类型
  • CS0747:初始化表达式成员声明符无效。
  • CS0820:无法将数组初始值设定项分配给隐式类型化局部变量
  • CS0826:找不到隐式类型数组的最佳类型。
  • CS0846:应为嵌套数组初始值设定项
  • CS1063: 与集合初始值设定项元素最匹配的重载 Add 方法已过时。
  • CS1552:数组类型说明符 [] 必须出现在参数名称之前
  • CS1586:数组创建必须具有数组大小或数组初始值设定项
  • CS1920:元素初始值设定项不能为空。
  • CS1921:最佳重载的方法匹配具有初始化表达式元素而言错误的签名。可初始化的 Add 必须是可访问的实例方法。
  • CS1925:无法使用集合初始值设定项初始化类型为“type”的对象。
  • CS1950与集合初始值最佳匹配的重载 Add 方法有一些无效参数。
  • CS1954:不能使用集合初始值设定项元素的最佳重载的方法匹配。集合初始值设定项“Add”方法不能有 refout 参数。
  • CS9174:无法使用集合文本初始化类型,因为该类型不可构造。
  • CS9176:集合文本没有目标类型。
  • CS9185:CollectionBuilderAttribute 生成器类型必须是非泛型类或结构。
  • CS9186:CollectionBuilderAttribute 方法名称无效。
  • CS9187:找不到具有预期签名的可访问方法:具有类型为 ReadOnlySpan<T> 的单个参数的静态方法;以及正确的返回类型
  • CS9188:类型具有 CollectionBuilderAttribute,但没有元素类型。
  • CS9203:此类型的集合表达式不能在此上下文中使用,因为它可能在当前范围之外公开。
  • CS9210:此版本的 System.Collections.Immutable.ImmutableArray<T> 不能与集合表达式一起使用。

此外,本文还介绍了以下警告:

  • CS1062与集合初始值设定项元素最匹配的重载 Add 方法已过时。
  • CS1064与集合初始值设定项元素最匹配的重载 Add 方法已过时。
  • CS3007:只是未命名数组类型不同的重载方法“method”不符合 CLS
  • CS3016:作为特性参数的数组不符合 CLS
  • CS0251:使用负索引编制数组的索引(数组索引始终从零开始)
  • CS9208:集合表达式可能会导致意外的堆分配。请考虑显式创建数组,然后转换为最终类型以将分配变为显式。
  • CS9209:由于使用“..”分布,集合表达式可能会导致意外的堆分配。请考虑显式创建数组,然后转换为最终类型以将分配变为显式。

可在以下文章中了解有关数组、集合初始值设定项和集合表达式的详细信息:

集合初始值设定项无效

以下错误指示编译器为集合初始值设定项生成的代码无效:

  • CS0747:初始值设定项成员声明符无效。
  • CS1063与集合初始值设定项元素最匹配的重载 Add 方法已过时。
  • CS1920:元素初始值设定项不能为空。
  • CS1921:最佳重载的方法匹配具有对初始化表达式元素而言错误的签名。可初始化的 Add 必须是可访问的实例方法。
  • CS1950与集合初始值最佳匹配的重载 Add 方法有一些无效参数。
  • CS1954:不能使用集合初始值设定项元素的最佳重载的方法匹配。集合初始值设定项“Add”方法不能有 refout 参数。
  • CS9174:无法使用集合文本初始化类型,因为该类型不可构造。
  • CS9176:集合文本没有目标类型。
  • CS9203:此类型的集合表达式不能在此上下文中使用,因为它可能在当前范围之外公开。
  • CS9210:此版本的 System.Collections.Immutable.ImmutableArray<T> 不能与集合表达式一起使用。

编译器还可能生成以下警告:

  • CS1062与集合初始值设定项元素最匹配的重载 Add 方法已过时。
  • CS1064与集合初始值设定项元素最匹配的重载 Add 方法已过时。
  • CS9208:集合表达式可能会导致意外的堆分配。请考虑显式创建数组,然后转换为最终类型以将分配变为显式。
  • CS9209:由于使用“..”分布,集合表达式可能会导致意外的堆分配。请考虑显式创建数组,然后转换为最终类型以将分配变为显式。

这些错误都表示编译器为集合初始值设定项生成的代码无效。 检查下列项目:

  • 集合初始值设定项包含一个元素序列。 不能将在集合实例上设置属性与在同一初始值设定项中添加元素的操作混合使用。
  • 包含大括号({})的集合初始值设定项不能为空。
  • 该类必须实现 IEnumerable 并具有公共 Add 方法。
  • 符合条件的 Add 方法必须可供访问,并采用与集合元素类型相同的一个参数。 参数不能包含 refout 修饰符。
  • 重载解析必须选取一个 Add 方法作为更好的匹配项。 不可能有多个匹配的方法同样良好。
  • 集合表达式可以初始化集合类型的显式类型化变量。 如果变量不是集合或数组类型,或者隐式类型化(使用 var),则不能使用集合初始值设定项。
  • 不能使用可能违反 ref 安全性的集合表达式初始化类型 ref struct(如 System.Span<T>)。
  • 集合表达式无法使用当前版本正确初始化 System.Collections.Immutable.ImmutableArray<T>。 使用不同版本的运行时,或更改初始化表达式。

警告指示集合表达式(包括任何分散元素)可能会分配内存。 创建不同的存储并进行转换可能更高效。

数组初始值设定项无效

  • CS0623:数组初始值设定项只能在变量或字段初始化表达式中使用。请尝试改用新的表达式。
  • CS0846:应为嵌套数组初始值设定项
  • CS1925:无法使用集合初始值设定项初始化类型为“type”的对象。

这些错误指示创建的初始值设定项无效。 原因可能是围绕一个或多个元素或子数组的大括号 {} 不均衡。 确保初始化表达式与交错数组初始化中的数组数匹配,并且大括号是均衡的。

无效的数组元素访问

  • CS0022:[] 内索引数错误,应为“number”
  • CS0251:使用负索引编制数组的索引(数组索引始终从零开始)

通过指定数组中声明的每个轴的索引来访问数组的元素。 索引在数组名称之后的 [] 之间。 数组索引有两个规则:

  1. 必须指定与数组声明中使用的索引数相同。 如果数组有一个维度,则必须指定一个索引。 如果数组有三个维度,则必须指定三个索引。
  2. 所有索引必须是非负整数。

数组排名无效

  • CS0178:级别说明符无效:应为“,”或“]
  • CS0650:数组声明符错误:要声明托管数组,级别说明符应位于变量的标识符之前。若要声明固定大小的缓冲区字段,请在字段类型之前使用 fixed 关键字。
  • CS1552:数组类型说明符 [] 必须出现在参数名称之前

数组声明由以下标记组成,顺序如下:

  1. 数组元素的类型。 例如,intstringSomeClassType
  2. 数组括号,可以选择包括逗号来表示多维。
  3. 变量名称。

当数组初始化指定数组维度时,可以指定以下属性:

  • 大括号中的许多元素({}
  • 空括号
  • 括在括号中的一个或多个逗号

例如,下面是有效的数组声明:

int[] anArrayOfIntegers;
string[,,] threeDimensionalStringArray;

有关详细信息,请参阅 C# 规范(C# 语言规范)中有关数组初始值设定项的部分。

数组长度无效

  • CS0248:无法创建大小为负值的数组
  • CS0270:不能在变量声明中指定数组大小(请尝试使用“new”表达式进行初始化)
  • CS1586:数组创建必须具有数组大小或数组初始值设定项

数组的每个维度的长度必须指定为数组初始化的一部分,而不是其声明。 每个维度的长度必须为正。 可以使用 new 表达式分配数组或使用数组初始值设定项来分配所有元素来指定长度。 以下示例演示了这两个机制:

int[] fiveIntegers = new int[5];
string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

元素类型无效

  • CS0611:数组元素不能为“type”类型
  • CS0719:数组元素不能是静态类型
  • CS0820:无法将数组初始值设定项分配给隐式类型化局部变量
  • CS0826:找不到隐式类型数组的最佳类型。

有些类型不能用作数组类。 这些类型包括 System.TypedReferenceSystem.ArgIterator。 数组的类型不能是 static 类,因为无法创建 static 类的实例。

可以将数组声明为隐式类型本地变量。 必须使用 new 表达式初始化数组。 此外,数组初始值设定项中的所有元素都必须具有最佳常见类型。 下列示例演示如何声明隐式类型化数组:

var implicitType = new[] { 1, 2, 3 };
        
char c = 'c';
short s1 = 0;
short s2 = -0;
short s3 = 1;
short s4 = -1;

// common type is "int"
var commonType = new[] { s1, s2, s3, s4, c, 1 };

可以使用以下任一技术确保最佳常见类型:

  • 为数组指定显式类型。
  • 为所有数组元素指定相同的类型。
  • 为可能会导致问题的那些元素提供显式强制转换。

集合生成器无效

以下错误指示集合生成器类型中的错误:

  • CS9185CollectionBuilderAttribute 生成器类型必须是非泛型类或结构。
  • CS9186CollectionBuilderAttribute 方法名称无效。
  • CS9187:找不到具有预期签名的可访问方法:具有类型为 ReadOnlySpan<T> 的单个参数的静态方法;以及正确的返回类型
  • CS9188:类型具有 CollectionBuilderAttribute,但不具有元素类型。

这些错误指示集合生成器类型需要修改。 请记住以下规则:

  • 集合类型必须具有迭代类型。 换句话说,可以将 foreach 类型为集合。
  • 集合生成器类型不能是泛型类型。
  • System.Runtime.CompilerServices.CollectionBuilderAttribute 上指定的方法名称必须是有效的方法名称。 例如,它不能是终结器,也不能是包含无效标识符字符的其他名称。
  • 集合生成器方法必须是可访问的静态方法。 它必须返回集合类型,并且必须采用 ReadOnlySpan<T> 参数,其中 T 与集合的元素类型匹配。

公共语言规范警告

  • CS3007:只是未命名数组类型不同的重载方法“method”不符合 CLS
  • CS3016作为特性参数的数组不符合 CLS

如果你有一个接受交错数组的重载方法,并且方法签名的唯一区别是数组的元素类型,则将发生 CS3007 错误。 若要避免此错误,请考虑使用矩形数组而不是交错数组,或者,如果不需要 CLS 合规性,请移除 CLSCompliantAttribute 特性。 有关 CLS 符合性的详细信息,请参阅语言独立性和与语言无关的组件

CS3016 指示将数组传递给属性不符合公共语言规范 (CLS)。 有关 CLS 符合性的详细信息,请参阅语言独立性和与语言无关的组件