通过


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

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

  • 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集合初始值设定项“ref”方法不能有 out 参数。
  • CS9174:无法使用集合文本初始化类型,因为该类型不可构造。
  • CS9176:集合文本没有目标类型。
  • CS9185:CollectionBuilderAttribute 生成器类型必须是非泛型类或结构。
  • CS9186:CollectionBuilderAttribute 方法名称无效。
  • CS9187:找不到具有预期签名的可访问方法:具有类型为 ReadOnlySpan<T> 的单个参数的静态方法;以及正确的返回类型
  • CS9188:类型具有 CollectionBuilderAttribute,但没有元素类型。
  • CS9203:此类型的集合表达式不能在此上下文中使用,因为它可能在当前范围之外公开。
  • CS9210:此版本的 System.Collections.Immutable.ImmutableArray<T> 不能与集合表达式一起使用。
  • CS9212分散运算符“”不能对类型“..type”的变量进行作,因为“type”不包含“member”的公共实例或扩展定义。
  • CS9213集合表达式目标“type”没有元素类型。
  • CS9214集合表达式类型必须具有可调用且无参数的适用构造函数。
  • CS9215集合表达式类型“type”必须具有可以使用单个参数调用的实例或扩展方法“Add”。
  • CS9222集合初始化会导致集合“type”的无限实例化循环。
  • CS9332不能在 catch 子句的筛选器表达式中使用'..'分布运算符。
  • CS9354“with(...)”元素必须是第一个元素
  • CS9355类型名“type”不支持“with(...)”元素
  • CS9356“with(...)”元素参数不能是动态的
  • CS9357只读接口的“with(...)”元素必须为空(如果存在
  • CS9358此集合的元素类型可能不是 ref 结构或允许 ref 结构的类型参数
  • CS9359方法“method”没有重载采用“number”with(...)“元素参数

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

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

无效的数组元素访问

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

若要正确访问数组元素,请遵循这些索引规则。 有关详细信息,请参阅 array

  • 指定与声明维度相同的索引数(CS0022)。 一维数组需要一个索引;三维数组需要三个索引。
  • 仅对数组索引(CS0251)使用非负整数。 数组索引始终从零开始。

集合初始值设定项无效

  • CS0747:初始值设定项成员声明符无效。
  • CS1920:元素初始值设定项不能为空。
  • CS1921:最佳重载的方法匹配具有对初始化表达式元素而言错误的签名。Add可初始化的 必须是可访问的实例方法。
  • CS1922无法使用集合初始化器初始化类型“type”,因为“type”没有实现“System.Collections.IEnumerable”。
  • CS1925:无法使用集合初始值设定项初始化类型为“type”的对象。
  • CS1927:警告:忽略模块的 /win32manifest,因为它仅适用于程序集
  • CS1950与集合初始值最佳匹配的重载 Add 方法有一些无效参数。
  • CS1954:不能使用集合初始值设定项元素的最佳重载的方法匹配。Add集合初始值设定项“ref”方法不能有 out 参数。
  • CS9174:无法使用集合文本初始化类型,因为该类型不可构造。
  • CS9176:集合文本没有目标类型。
  • CS9203:此类型的集合表达式不能在此上下文中使用,因为它可能在当前范围之外公开。
  • CS9210此版本的 System.Collections.Immutable.ImmutableArray<T> 不能与集合表达式一起使用。
  • CS9212分散运算符“”不能对类型为“..type”的变量进行作,因为“type”不包含“member”的公共实例或扩展定义。
  • CS9213集合表达式目标“type”没有元素类型。
  • CS9214集合表达式类型必须具有可调用且无参数的适用构造函数。
  • CS9215集合表达式类型“type”必须具有可以使用单个参数调用的实例或扩展方法“Add”。
  • CS9222集合初始值设定项会导致集合“类型”的无限实例化链。
  • CS9332不能在 catch 子句的筛选器表达式中使用'..'分布运算符。
  • CS9354“with(...)”元素必须是第一个元素
  • CS9355类型“type”不支持“with(...)”元素
  • CS9356“with(...)”元素参数不能是动态的
  • CS9357只读接口的“with(...)”元素必须为空(如果存在
  • CS9358此集合的元素类型可能不是 ref 结构或允许 ref 结构的类型参数
  • CS9359方法“method”没有重载采用“number”with(...)“元素参数

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

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

若要创建有效的集合初始值设定项,请遵循这些规则。 有关详细信息,请参阅 集合表达式

  • 不要在同一初始化器中将属性初始化与元素添加混合使用(CS0747)。
  • 在集合初始值设定项中包含至少一个带大括号的元素(CS1920)。
  • 确保集合类型实现 IEnumerableCS1922)。
  • 仅对集合类型(CS1925)使用集合初始值设定项。
  • Add验证方法是否可访问,采用与元素类型匹配的一个参数,并且不使用refout修饰符(CS1921CS1954)。
  • 解决不明确的 Add 方法重载(CS1950)。
  • 当编译器无法推断集合表达式时,请为集合表达式提供显式目标类型(CS9176CS9213)。
  • 确保集合类型可以使用无参数构造函数进行构造(CS9174CS9214)。
  • 请勿在违反 ref safety 的集合表达式中使用 ref struct 类型(CS9203)。
  • 更新为集合表达式的兼容运行时版本 ImmutableArrayCS9210)。
  • 为分散运算符支持(GetEnumerator)实现枚举模式(如)。
  • 避免集合初始化中的循环依赖项(CS9222)。
  • 请勿在 catch 子句筛选器表达式中使用分布运算符(CS9332)。
  • with(...) 元素首先放在集合表达式(CS9354)中。
  • 仅对支持集合表达式参数的类型(with(...))使用元素。
  • 请勿在 with(...) 元素中使用动态参数(CS9356)。
  • 将空 with() 用于只读接口类型(CS9357)。
  • 请勿在不支持它们的集合中使用 ref 结构类型作为元素类型(CS9358)。
  • 将参数数 with(...) 与可用的构造函数重载(CS9359)匹配。

数组排名无效

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

若要正确声明数组,请遵循正确的语法顺序。 有关详细信息,请参阅 数组 和有关数组初始值设定项的 C# 语言规范 部分。

数组声明按顺序包含以下标记:

  1. 数组元素的类型(例如,intstringSomeClassType)。
  2. 数组括号可选地包括用于多个维度的逗号。
  3. 变量名称。

指定数组维度时,可以使用:

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

以下示例显示了有效的数组声明:

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

数组长度无效

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

若要创建长度有效的数组,请在初始化期间指定大小,而不是声明。 有关详细信息,请参阅 array

  • 将数组长度指定为初始化的一部分,而不是声明(CS0270)。
  • 仅对数组维度使用正整数(CS0248)。
  • 请在new表达式或数组初始值设定项(CS1586)中指定大小。

以下示例演示了这两个机制:

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

元素类型无效

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

若要使用具有正确元素类型的数组,请遵循这些类型限制。 有关详细信息,请参阅 隐式类型局部变量最佳常见类型

  • 请勿使用受限类型(如 System.TypedReference 数组元素类型)和 System.ArgIterator 数组元素类型(CS0611)。
  • 不要将 static 类用作数组元素类型,因为无法创建实例(CS0719)。
  • 使用 new 表达式(CS0820)初始化隐式类型数组。
  • 确保隐式类型数组初始值设定项中的所有元素都具有最佳通用类型(CS0826)。

以下示例演示如何声明隐式类型数组:

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 };

若要确保最佳通用类型,请使用以下任一技术:

  • 为数组指定显式类型。
  • 为所有数组元素指定相同的类型。
  • 对可能导致问题的元素执行显式类型转换。

数组初始值设定项无效

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

这些错误表示数组初始值设定项语法无效。 有关详细信息,请参阅 array

创建有效的数组初始化器:

  • 仅在变量或字段声明中使用数组初始值设定项(CS0623)。 在其他上下文中使用new表达式。
  • 在元素或子数组({)周围平衡大括号(})。
  • 确保初始化表达式与交错数组初始化中的数组数匹配。
  • 仅对集合类型使用集合初始值设定项,而不对数组或其他类型(CS1925) 使用集合初始值设定项。

集合生成器无效

  • CS9175表达式树可能不包含集合表达式。
  • CS9177“CollectionBuilderAttribute”生成器方法返回类型必须与“betterness”中使用的集合类型匹配。
  • CS9178自然类型“type”没有对应的目标类型。
  • CS9179集合表达式类型必须具有可调用且无参数的适用构造函数。
  • CS9180“CollectionBuilderAttribute”生成器方法必须是静态方法。
  • CS9181“CollectionBuilderAttribute”生成器方法参数类型必须与参数“ReadOnlySpan<{0}>”匹配
  • CS9182“CollectionBuilderAttribute”无效。在生成器类型“”上找不到匹配的“{0}{1}”方法。
  • CS9183“CollectionBuilderAttribute”方法返回类型必须是非抽象的非接口类型,可作为“type”使用
  • CS9185静态类型不能用作类型参数。
  • CS9186CollectionBuilderAttribute 方法名称无效。
  • CS9187找不到具有预期签名的可访问“Create”方法:一个静态方法,它具有单个参数,参数类型为“ReadOnlySpan<{0}>”,返回类型为“{1}”。
  • CS9188“scoped”不能用作集合表达式类型参数的修饰符。
  • CS9190“CollectionBuilderAttribute”方法“builderMethod”不可应用,因为它是泛型方法。
  • CS9192内联数组转换不能与集合表达式一起使用。
  • CS9193参数“argument”不能与“ref”关键字一起传递。
  • CS9194参数“argument”不能通过“out”关键字传递
  • CS9195参数“argument”可能不是使用“in”关键字传递
  • CS9196功能“集合表达式”在 C# “version”中不可用。请使用语言版本“requiredVersion”或更高版本。
  • CS9197C# “version”中不提供功能“内联数组”。请使用语言版本“requiredVersion”或更高版本。
  • CS9198: C# 版本 'version' 不提供功能 'ref 和 unsafe 用于异步方法和迭代器方法'。请使用语言版本 'requiredVersion' 或更高的版本。
  • CS9199功能“集合表达式”在 C# “version”中不可用。请使用语言版本“requiredVersion”或更高版本。
  • CS9202C# “version”中不提供功能“ref readonly parameters”。请使用语言版本“requiredVersion”或更高版本。
  • CS9208不能在内联数组访问上使用“nameof”运算符。
  • CS9209ref-returning 属性“property”不能用作值参数。
  • CS9211表达式的类型必须为“type”,因为该表达式是通过引用分配
  • CS9212不能使用集合表达式作为固定语句中的值
  • CS9217“ref”局部变量无法跨“await”或“yield”边界保持。
  • CS9218“paramName”是一个 ref 结构,不能是参数的类型
  • CS9221类型“type”可能不是 ref 结构或类型参数,允许 ref 结构,以便将其用作泛型类型或方法“member”中的参数“parameter”
  • CS9223不能在集合表达式中使用包含“ref”字段的结构。
  • CS9228不允许对 ref 结构进行非变量声明
  • CS9232分部方法声明具有签名差异。
  • CS9233“file”修饰符只能用于编译单元中顶级定义的类型

若要正确创建具有集合生成器属性的集合表达式,请遵循这些要求。 有关详细信息,请参阅 集合表达式

  • 确保目标类型具有支持 foreachCS9188) 的迭代类型。
  • 不要将泛型类型用作集合生成器类型(CS9185)。
  • 验证指定 CollectionBuilderAttribute 的方法名称是否有效(CS9186)。
  • CollectionBuilderAttribute仅适用于与所需签名匹配的静态方法:返回集合类型并采用与ReadOnlySpan<T>元素类型匹配的参数TCS9180、CS9181CS9182CS9183、CS9187、CS9190)。
  • 确保返回类型匹配且不是抽象或接口(CS9177CS9183)。
  • 不要对集合表达式中的 ref 字段使用 ref 结构或类型(CS9218CS9221、CS9223CS9228)。
  • 避免在表达式树中使用集合表达式(CS9175)。
  • 对集合表达式和相关功能使用正确的语言版本(CS9196CS9197CS9198CS9199CS9202)。

公共语言规范警告

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

若要编写符合 CLS 标准的数组代码,请遵循以下准则。 有关详细信息,请参阅 语言独立性

  • 不要创建仅在数组元素类型上有区别的重载方法(CS3007)。
  • 不要将数组用作属性参数(CS3016)。

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

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