如果没有为形参提供自实参,或者实参对该形参无效,编译器将生成以下错误:
- CS0182:特性实参必须是特性形参类型的常量表达式、
typeof
表达式或数组创建表达式 - CS0591:特性的实参值无效
- CS0599:命名特性实参“argument”的值无效
- CS0617:不是有效的命名特性实参。命名特性实参必须是非只读、非静态、非常数的字段,或者必须是公共的和非静态的读写属性。
- 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:不是有效的命名特性实参。命名特性实参必须是非只读、非静态、非常数的字段,或者必须是公共的和非静态的读写属性。
- 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:未显式提供形参,但它用作形参上的内插字符串处理程序转换的实参。
内插字符串处理程序是基于模式的构造。 正确获取模式非常重要。 请参阅功能规范,或者按照有关构建内插字符串处理程序的教程进行操作。
调用方调试信息
如果错误地使用了 System.Runtime.CompilerServices.CallerArgumentExpressionAttribute,编译器会发出以下错误:
- CS8964:
CallerArgumentExpressionAttribute
只能应用于具有默认值的形参
此外,如果错误地使用 CallerArgumentExpressionAttribute
,编译器会发出以下警告:
- CS8965:应用于形参的
CallerArgumentExpressionAttribute
无效,因为它是自引用的。 - CS8966:
CallerArgumentExpressionAttribute
将不起作用,因为它应用到的成员在不允许使用可选实参的上下文中使用
使用 CallerArgumentExpression
特性批注的任何形参都必须具有默认值。