如果没有为正式参数提供参数,或者该参数对该参数无效,编译器将生成以下错误:
-
CS0182: 属性参数必须是特性参数类型的常量表达式、
typeof表达式或数组创建表达式 - CS0591: 属性参数的值无效
- CS0599: 命名属性参数“argument”的值无效
- CS0617: 不是有效的命名属性参数。命名属性参数必须是非只读、静态或 const 的字段,或者是公共属性而不是静态的读写属性。
- CS0633: 属性的参数必须是有效的标识符
- CS0643:重复具名属性参数
- CS0655: 不是有效的命名属性参数,因为它不是有效的属性参数类型
- CS0839: 缺少参数。
- CS1016:需要命名的属性参数
- CS1739: 最佳重载没有名为 的参数
- CS1740: 无法多次指定命名参数
- CS1742: 数组访问可能没有命名参数说明符
- CS1744:命名参数用于指定已通过位置参数指定的参数
- CS1746: 委托没有名为“name”的参数
- CS7036: 没有给定对应于所需参数的参数
- CS7067: 属性构造函数参数是可选的,但没有指定默认参数值。
- CS8324: 命名参数规范必须在动态调用中指定所有固定参数后显示。
- CS8905: 不能使用命名参数调用函数指针。
- CS8943: null 不是有效的参数名称。若要访问实例方法的接收方,请使用空字符串作为参数名称。
- CS8944: 方法不是实例方法,接收方不能是内插字符串处理程序参数。
- CS8945: 不是有效的参数名称。
-
CS8948:
InterpolatedStringHandlerArgumentAttribute参数不能引用使用该特性的参数。 -
CS8949:
InterpolatedStringHandlerArgumentAttribute应用于参数的格式不正确,无法解释。手动构造它的实例。 - CS8950: 参数是参数上内插字符串处理程序转换的参数,但在内插字符串表达式之后指定了相应的参数。对参数重新排序。
- CS8951: 未显式提供参数,而是用作参数上的内插字符串处理程序转换的参数。
-
CS8964:
CallerArgumentExpressionAttribute只能应用于具有默认值的参数 -
CS8965:
CallerArgumentExpressionAttribute应用于参数将无效果,因为它是自引用的。 -
CS8966:
CallerArgumentExpressionAttribute将不起作用,因为它适用于不允许可选参数的上下文中使用的成员
缺少参数
当编译器无法匹配所有成员参数的参数时,将发出以下常规错误:
- CS0839: 缺少参数。
- CS7036: 没有给定对应于所需参数的参数
这些错误是常规的:编译器与方法调用中给定的参数不匹配该方法的必需参数。 检查以下原因:
- 请确保包含所有必要的参数。
- 请确保参数的顺序正确。
- 确保所有参数都是正确的类型。
- 确保重载解析规则选择了预期的方法。
如果编写了重载的本地函数,则可能还会看到 CS7036 。 无法重载本地函数。 编译器仅识别具有该名称的第一个本地函数。 检查是否要调用其他本地函数。
这些错误通常与其他诊断一起出现,这些诊断有助于诊断正确的原因。
属性的参数
当属性构造函数的参数不正确时,编译器会发出以下错误:
-
CS0182: 属性参数必须是特性参数类型的常量表达式、
typeof表达式或数组创建表达式 - CS0591: 属性参数的值无效
- CS0599: 命名属性参数“argument”的值无效
- CS0617: 不是有效的命名属性参数。命名属性参数必须是非静态、const 或只读的字段,或是公共的、非静态的读写属性。
- CS0633: 属性的参数必须是有效的标识符
- CS0643:重复命名的特性参数
- CS0655: 不是有效的命名属性参数,因为它不是有效的属性参数类型
如果使用属性 System.AttributeUsageAttribute 定义,请确保允许的值不相互排斥。 检查属性的参数的类型和顺序是否正确。 确保字符串参数的文本有效。 对于许多属性,参数必须是有效的 C# 标识符。 属性构造函数的参数必须是编译时常量。 因此,它们仅限于支持文本常量的类型。 此外,不允许将允许文本常量作为属性参数的以下类型:
不能指定具有相同参数名称的重复命名参数。 只能在初始化属性时设置可访问的属性。 无法设置专用属性。
命名参数和可选参数及参数值
编译器因命名参数和可选参数使用错误而发出以下错误:
- CS1016: 预期命名属性参数
- CS1739: 最佳重载没有名为 的参数
- CS1740: 无法多次指定命名参数
- CS1742: 数组访问可能没有命名参数说明符
- CS1744:命名参数为已经使用位置参数的参数指定了值
- CS1746: 委托没有名为“name”的参数
- CS7067: 属性构造函数参数是可选的,但没有指定默认参数值。
- CS8324: 命名参数规范必须在动态调用中指定所有固定参数后显示。
- CS8905: 不能使用命名参数调用函数指针。
检查这些错误的以下原因:
- 命名参数的参数名称不正确。
- 所选重载没有与命名参数匹配的参数。
- 参数名称在多个参数上重复。
- 位置(未命名)参数显示在命名参数之后。
- 命名参数不允许用于数组索引参数。
内插字符串处理程序
错误地指定 了内插字符串处理程序 时,编译器会发出以下错误。
- CS8943: null 不是有效的参数名称。若要访问实例方法的接收方,请使用空字符串作为参数名称。
- CS8944: 不是实例方法,接收方不能是内插字符串处理程序参数。
- CS8945: 不是有效的参数名称。
-
CS8948:
InterpolatedStringHandlerArgumentAttribute参数不能引用使用该特性的参数。 -
CS8949:
InterpolatedStringHandlerArgumentAttribute应用于参数的格式不正确,无法解释。手动构造实例。 - CS8950: 参数是参数上内插字符串处理程序转换的参数,但在内插字符串表达式之后指定了相应的参数。
- CS8951: 未显式提供参数,而是用作参数上的内插字符串处理程序转换的参数。
内插字符串处理程序是基于模式的构造。 正确设置模式非常重要。 请参阅有关 自定义内插字符串表达式处理程序的 C# 语言规范部分,或按照有关 生成内插字符串处理程序的教程进行操作。
调用者调试信息
编译器在错误使用 System.Runtime.CompilerServices.CallerArgumentExpressionAttribute时发出以下错误:
-
CS8964:
CallerArgumentExpressionAttribute只能应用于具有默认值的参数
此外,编译器在错误使用 CallerArgumentExpressionAttribute时发出以下警告:
-
CS8965:
CallerArgumentExpressionAttribute应用于参数无效,因为它是自引用。 -
CS8966:
CallerArgumentExpressionAttribute将不起作用,因为它适用于不允许可选参数的上下文中使用的成员
使用 CallerArgumentExpression 特性批注的任何参数都必须具有默认值。