解决影响重载解析的错误和警告。

本文介绍以下编译器错误:

  • CS0034 - 运算符对于“type1”和“type2”类型的操作数具有二义性
  • CS0035 - 运算符对于“type”类型的操作数具有二义性
  • CS0111 - 类型已定义了一个名为“name”的具有相同参数类型的成员
  • CS0121 - 以下方法或属性之间的调用不明确
  • CS0457 - 当从“type1”转换为“type2”时,用户定义的转换不明确。
  • CS0663 - 无法定义仅在 refout 上存在不同的重载方法。
  • CS1007 - 属性访问器已经定义
  • CS1019 - 应输入可重载的一元运算符
  • CS1020 - 应输入可重载的二元运算符
  • CS1501 - 方法“method”的重载不带有“number”个参数
  • CS1534 - 重载的二元运算符“operator”采用两个参数
  • CS1535 - 重载的一元运算符“operator”采用一个参数
  • CS1928 - “Type”不包含“method”的定义,并且最佳扩展方法重载“method”的某些参数无效。
  • CS1929 - “TypeA”不包含“method”的定义,最佳扩展方法重载“TypeB.method”需要“TypeC”类型的接收器
  • CS8315 - 运算符对于操作数具有二义性
  • CS9261 - 不能对替代成员使用“OverloadResolutionPriorityAttribute”。
  • CS9262 - 不能对此成员使用“OverloadResolutionPriorityAttribute”。

此外,还有以下编译器警告:

  • CS3006 - refout 或者仅数组秩不同的重载方法“method”不符合 CLS

重载定义不正确

  • CS0663 - 无法定义仅在 refout 上存在不同的重载方法。
  • CS1019 - 应输入可重载的一元运算符
  • CS1020 - 应输入可重载的二元运算符
  • CS1534 - 重载的二元运算符“operator”采用两个参数
  • CS1535 - 重载的一元运算符“operator”采用一个参数

此外,还有以下编译器警告:

  • CS3006 - refout 或者仅数组秩不同的重载方法“method”不符合 CLS

在类中创建重载运算符时,签名必须与该运算符所需的参数数目匹配。 运算符定义中的参数数目错误。

此外,重载运算符必须使用定义的运算符名称。 唯一的例外是创建转换运算符时,其中运算符名称与转换的返回类型匹配。

定义的重载重复

  • CS0111 - 类型已定义了一个名为“name”的具有相同参数类型的成员
  • CS1007 - 属性访问器已经定义

这些错误指示你创建了不同的重载。 常见原因包括:

  • 匹配的参数类型具有标识转换。 例如 M(dynamic)M(object),或者 M2(string)M2(string?)
  • 匹配的参数类型仅在引用修饰符方面不同。 例如,M(ref int)M(out int)
  • 你同时包含了属性的 initset 访问器。

未找到重载

  • CS1501 - 方法“method”的重载不带有“number”个参数
  • CS1928 - “Type”不包含“method”的定义,并且最佳扩展方法重载“method”的某些参数无效。
  • CS1929 - “TypeA”不包含“method”的定义,最佳扩展方法重载“TypeB.method”需要“TypeC”类型的接收器

代码调用存在此名称的方法,但某些参数不正确,或者使用了错误的参数数量。 如果你要尝试调用扩展方法,则包含类可能位于未导入的命名空间中。

注意

错误:最新编译器未使用 CS1928。 较新的编译器专门使用 CS1929

不明确的重载

  • CS0034 - 运算符对于“type1”和“type2”类型的操作数具有二义性
  • CS0035 - 运算符对于“type”类型的操作数具有二义性
  • CS0121 - 以下方法或属性之间的调用不明确
  • CS0457 - 当从“type1”转换为“type2”时,用户定义的转换不明确
  • CS8315 - 运算符对于操作数具有二义性

这些错误表明没有比其他更好的重载。 这些错误可能因以下多种原因所致:

  • 对于每个参数,其他参数更好。 一个可能是完全匹配项,另一个需要转换:

      void M(int a, double b) {    }
      void M(double a, int b) {}
    
      M(1, 1); // ambiguous
    
  • 多个用户定义的转换运算符是候选项。 可以在源类型、基类型、目标类型或其基类型中声明转换运算符。 如果在多个项中定义了转换运算符,则编译器无法选取。

  • 多个转换运算符可以执行兼容的转换。

  • 一个或多个参数使用 default(不是 default(T)),并且可以选择多个类型。

在大多数情况下,添加显式强制转换可以指定应选择哪个重载。

重载解析优先级

  • CS9261 - 不能对替代成员使用“OverloadResolutionPriorityAttribute”。
  • CS9262 - 不能对此成员使用“OverloadResolutionPriorityAttribute”。

你的代码违反了使用 OverloadResolutionPriorityAttribute 支持一个重载而不是另一个重载的规则。 你不能将 OverloadResolutionPriorityAttribute 应用于以下方法类型:

  • 非索引器属性
  • 属性、索引器或事件访问器
  • 转换运算符
  • Lambda
  • 本地函数
  • 终结器
  • 静态构造函数

此外,不能将 OverloadResolutionPriorityAttribute 应用于 virtualabstract 成员的 override。 编译器使用基类型声明中的值。