形参和实参不匹配

如果没有为形参提供自实参,或者实参对该形参无效,编译器将生成以下错误:

  • 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:不是有效的形参名称。
  • CS8948InterpolatedStringHandlerArgumentAttribute 实参不能引用使用该特性的形参。
  • CS8949:应用于形参的 InterpolatedStringHandlerArgumentAttribute 格式不正确,无法解释。手动构造它的实例。
  • CS8950:形参是形参上的内插字符串处理程序转换的实参,但在内插字符串表达式后面指定了相应的实参。请对形参进行重新排序。
  • CS8951:未显式提供形参,但它用作形参上的内插字符串处理程序转换的实参。
  • CS8964CallerArgumentExpressionAttribute 只能应用于具有默认值的形参
  • CS8965:应用于形参的 CallerArgumentExpressionAttribute 无效,因为它是自引用的。
  • CS8966CallerArgumentExpressionAttribute 将不起作用,因为它应用到的成员在不允许使用可选实参的上下文中使用

缺少实参

当编译器无法匹配所有成员形参的实参时,将发出以下常规错误:

  • 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:不是有效的形参名称。
  • CS8948InterpolatedStringHandlerArgumentAttribute 实参不能引用使用该特性的形参。
  • CS8949:应用于形参的 InterpolatedStringHandlerArgumentAttribute 格式不正确,无法解释。请手动构造实例。
  • CS8950:形参是形参上的内插字符串处理程序转换的实参,但在内插字符串表达式后面指定了相应的实参。
  • CS8951:未显式提供形参,但它用作形参上的内插字符串处理程序转换的实参。

内插字符串处理程序是基于模式的构造。 正确获取模式非常重要。 请参阅功能规范,或者按照有关构建内插字符串处理程序的教程进行操作。

调用方调试信息

如果错误地使用了 System.Runtime.CompilerServices.CallerArgumentExpressionAttribute,编译器会发出以下错误:

  • CS8964CallerArgumentExpressionAttribute 只能应用于具有默认值的形参

此外,如果错误地使用 CallerArgumentExpressionAttribute,编译器会发出以下警告:

  • CS8965:应用于形参的 CallerArgumentExpressionAttribute 无效,因为它是自引用的。
  • CS8966CallerArgumentExpressionAttribute 将不起作用,因为它应用到的成员在不允许使用可选实参的上下文中使用

使用 CallerArgumentExpression 特性批注的任何形参都必须具有默认值。