参数和实参不匹配

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

  • CS0182属性参数必须是特性参数类型的常量表达式、 typeof 表达式或数组创建表达式
  • CS0591属性参数的值无效
  • CS0599命名属性参数“argument”的值无效
  • CS0617不是有效的命名属性参数。命名属性参数必须是非只读、静态或 const 的字段,或者是公共属性而不是静态的读写属性。
  • CS0633属性的参数必须是有效的标识符
  • CS0643重复具名属性参数
  • CS0655不是有效的命名属性参数,因为它不是有效的属性参数类型
  • CS0839缺少参数。
  • CS1016需要命名的属性参数
  • CS1739最佳重载没有名为 的参数
  • CS1740无法多次指定命名参数
  • CS1742数组访问可能没有命名参数说明符
  • CS1744命名参数用于指定已通过位置参数指定的参数
  • CS1746委托没有名为“name”的参数
  • CS7036没有给定对应于所需参数的参数
  • CS7067属性构造函数参数是可选的,但没有指定默认参数值。
  • CS8324命名参数规范必须在动态调用中指定所有固定参数后显示。
  • CS8905不能使用命名参数调用函数指针。
  • CS8943null 不是有效的参数名称。若要访问实例方法的接收方,请使用空字符串作为参数名称。
  • CS8944方法不是实例方法,接收方不能是内插字符串处理程序参数。
  • CS8945不是有效的参数名称。
  • CS8948InterpolatedStringHandlerArgumentAttribute 参数不能引用使用该特性的参数。
  • CS8949InterpolatedStringHandlerArgumentAttribute应用于参数的格式不正确,无法解释。手动构造它的实例。
  • CS8950参数是参数上内插字符串处理程序转换的参数,但在内插字符串表达式之后指定了相应的参数。对参数重新排序。
  • CS8951未显式提供参数,而是用作参数上的内插字符串处理程序转换的参数。
  • CS8964CallerArgumentExpressionAttribute只能应用于具有默认值的参数
  • CS8965CallerArgumentExpressionAttribute应用于参数将无效果,因为它是自引用的。
  • CS8966CallerArgumentExpressionAttribute将不起作用,因为它适用于不允许可选参数的上下文中使用的成员

缺少参数

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

  • 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不能使用命名参数调用函数指针。

检查这些错误的以下原因:

  • 命名参数的参数名称不正确。
  • 所选重载没有与命名参数匹配的参数。
  • 参数名称在多个参数上重复。
  • 位置(未命名)参数显示在命名参数之后。
  • 命名参数不允许用于数组索引参数。

内插字符串处理程序

错误地指定 了内插字符串处理程序 时,编译器会发出以下错误。

  • CS8943null 不是有效的参数名称。若要访问实例方法的接收方,请使用空字符串作为参数名称。
  • CS8944不是实例方法,接收方不能是内插字符串处理程序参数。
  • CS8945不是有效的参数名称。
  • CS8948InterpolatedStringHandlerArgumentAttribute 参数不能引用使用该特性的参数。
  • CS8949InterpolatedStringHandlerArgumentAttribute应用于参数的格式不正确,无法解释。手动构造实例。
  • CS8950参数是参数上内插字符串处理程序转换的参数,但在内插字符串表达式之后指定了相应的参数。
  • CS8951未显式提供参数,而是用作参数上的内插字符串处理程序转换的参数。

内插字符串处理程序是基于模式的构造。 正确设置模式非常重要。 请参阅有关 自定义内插字符串表达式处理程序的 C# 语言规范部分,或按照有关 生成内插字符串处理程序的教程进行操作。

调用者调试信息

编译器在错误使用 System.Runtime.CompilerServices.CallerArgumentExpressionAttribute时发出以下错误:

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

此外,编译器在错误使用 CallerArgumentExpressionAttribute时发出以下警告:

  • CS8965CallerArgumentExpressionAttribute应用于参数无效,因为它是自引用。
  • CS8966CallerArgumentExpressionAttribute将不起作用,因为它适用于不允许可选参数的上下文中使用的成员

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