本文介绍以下编译器错误:
- 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)。
- 确保集合类型实现
IEnumerable(CS1922)。 - 仅对集合类型(CS1925)使用集合初始值设定项。
-
Add验证方法是否可访问,采用与元素类型匹配的一个参数,并且不使用ref或out修饰符(CS1921、CS1954)。 - 解决不明确的
Add方法重载(CS1950)。 - 当编译器无法推断集合表达式时,请为集合表达式提供显式目标类型(CS9176、 CS9213)。
- 确保集合类型可以使用无参数构造函数进行构造(CS9174,CS9214)。
- 请勿在违反 ref safety 的集合表达式中使用
ref struct类型(CS9203)。 - 更新为集合表达式的兼容运行时版本
ImmutableArray(CS9210)。 - 为分散运算符支持(
GetEnumerator)实现枚举模式(如)。 - 避免集合初始化中的循环依赖项(CS9222)。
- 请勿在 catch 子句筛选器表达式中使用分布运算符(CS9332)。
- 将
with(...)元素首先放在集合表达式(CS9354)中。 - 仅对支持集合表达式参数的类型(
with(...))使用元素。 - 请勿在
with(...)元素中使用动态参数(CS9356)。 - 将空
with()用于只读接口类型(CS9357)。 - 请勿在不支持它们的集合中使用 ref 结构类型作为元素类型(CS9358)。
- 将参数数
with(...)与可用的构造函数重载(CS9359)匹配。
数组排名无效
- CS0178
,:级别说明符无效:应为“]”或“” - CS0650:数组声明符错误:要声明托管数组,级别说明符应位于变量的标识符之前。若要声明固定大小的缓冲区字段,请在字段类型之前使用 fixed 关键字。
- CS1552:数组类型说明符
[]必须出现在参数名称之前
若要正确声明数组,请遵循正确的语法顺序。 有关详细信息,请参阅 数组 和有关数组初始值设定项的 C# 语言规范 部分。
数组声明按顺序包含以下标记:
- 数组元素的类型(例如,
int或stringSomeClassType)。 - 数组括号可选地包括用于多个维度的逗号。
- 变量名称。
指定数组维度时,可以使用:
- 大括号中的许多元素(
{和}) - 空括号
- 括在括号中的一个或多个逗号
以下示例显示了有效的数组声明:
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:静态类型不能用作类型参数。
- CS9186:
CollectionBuilderAttribute方法名称无效。 - CS9187:找不到具有预期签名的可访问“Create”方法:一个静态方法,它具有单个参数,参数类型为“ReadOnlySpan<{0}>”,返回类型为“{1}”。
- CS9188: “scoped”不能用作集合表达式类型参数的修饰符。
- CS9190: “CollectionBuilderAttribute”方法“builderMethod”不可应用,因为它是泛型方法。
- CS9192: 内联数组转换不能与集合表达式一起使用。
- CS9193: 参数“argument”不能与“ref”关键字一起传递。
- CS9194: 参数“argument”不能通过“out”关键字传递
- CS9195:参数“argument”可能不是使用“in”关键字传递的
- CS9196: 功能“集合表达式”在 C# “version”中不可用。请使用语言版本“requiredVersion”或更高版本。
- CS9197: C# “version”中不提供功能“内联数组”。请使用语言版本“requiredVersion”或更高版本。
- CS9198: C# 版本 'version' 不提供功能 'ref 和 unsafe 用于异步方法和迭代器方法'。请使用语言版本 'requiredVersion' 或更高的版本。
- CS9199: 功能“集合表达式”在 C# “version”中不可用。请使用语言版本“requiredVersion”或更高版本。
- CS9202: C# “version”中不提供功能“ref readonly parameters”。请使用语言版本“requiredVersion”或更高版本。
- CS9208: 不能在内联数组访问上使用“nameof”运算符。
- CS9209: ref-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”修饰符只能用于编译单元中顶级定义的类型
若要正确创建具有集合生成器属性的集合表达式,请遵循这些要求。 有关详细信息,请参阅 集合表达式。
- 确保目标类型具有支持
foreach(CS9188) 的迭代类型。 - 不要将泛型类型用作集合生成器类型(CS9185)。
- 验证指定
CollectionBuilderAttribute的方法名称是否有效(CS9186)。 -
CollectionBuilderAttribute仅适用于与所需签名匹配的静态方法:返回集合类型并采用与ReadOnlySpan<T>元素类型匹配的参数T(CS9180、CS9181、CS9182、CS9183、CS9187、CS9190)。 - 确保返回类型匹配且不是抽象或接口(CS9177、 CS9183)。
- 不要对集合表达式中的 ref 字段使用 ref 结构或类型(CS9218、CS9221、CS9223、CS9228)。
- 避免在表达式树中使用集合表达式(CS9175)。
- 对集合表达式和相关功能使用正确的语言版本(CS9196、 CS9197、 CS9198、 CS9199、 CS9202)。
公共语言规范警告
- CS3007:只是未命名数组类型不同的重载方法“method”不符合 CLS
- CS3016:作为特性参数的数组不符合 CLS
若要编写符合 CLS 标准的数组代码,请遵循以下准则。 有关详细信息,请参阅 语言独立性。
- 不要创建仅在数组元素类型上有区别的重载方法(CS3007)。
- 不要将数组用作属性参数(CS3016)。
如果你有一个接受交错数组的重载方法,并且方法签名的唯一区别是数组的元素类型,则将发生 CS3007 错误。 若要避免此错误,请考虑使用矩形数组而不是交错数组,或者,如果不需要 CLS 合规性,请移除 CLSCompliantAttribute 特性。 有关 CLS 符合性的详细信息,请参阅语言独立性和与语言无关的组件。
CS3016 指示将数组传递给属性不符合公共语言规范 (CLS)。 有关 CLS 符合性的详细信息,请参阅语言独立性和与语言无关的组件。