本文介绍以下编译器错误:
- CS0034 - 运算符对于“
type1
”和“type2
”类型的操作数具有二义性 - CS0035 - 运算符对于“type”类型的操作数具有二义性
- CS0111 - 类型已定义了一个名为“name”的具有相同参数类型的成员
- CS0121 - 以下方法或属性之间的调用不明确
- CS0457 - 当从“type1”转换为“type2”时,用户定义的转换不明确。
- CS0663 - 无法定义仅在
ref
和out
上存在不同的重载方法。 - 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 - 仅
ref
或out
或者仅数组秩不同的重载方法“method”不符合 CLS
重载定义不正确
- CS0663 - 无法定义仅在
ref
和out
上存在不同的重载方法。 - CS1019 - 应输入可重载的一元运算符
- CS1020 - 应输入可重载的二元运算符
- CS1534 - 重载的二元运算符“operator”采用两个参数
- CS1535 - 重载的一元运算符“operator”采用一个参数
此外,还有以下编译器警告:
- CS3006 - 仅
ref
或out
或者仅数组秩不同的重载方法“method”不符合 CLS
在类中创建重载运算符时,签名必须与该运算符所需的参数数目匹配。 运算符定义中的参数数目错误。
此外,重载运算符必须使用定义的运算符名称。 唯一的例外是创建转换运算符时,其中运算符名称与转换的返回类型匹配。
定义的重载重复
- CS0111 - 类型已定义了一个名为“name”的具有相同参数类型的成员
- CS1007 - 属性访问器已经定义
这些错误指示你创建了不同的重载。 常见原因包括:
- 匹配的参数类型具有标识转换。 例如
M(dynamic)
或M(object)
,或者M2(string)
和M2(string?)
。 - 匹配的参数类型仅在引用修饰符方面不同。 例如,
M(ref int)
和M(out int)
。 - 你同时包含了属性的
init
和set
访问器。
未找到重载
- 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
应用于 virtual
或 abstract
成员的 override
。 编译器使用基类型声明中的值。