CA2225:运算符重载具有命名的备用项

属性
规则 ID CA2225
标题 运算符重载具有命名的备用项
类别 使用情况
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用

原因

检测到运算符重载,但未找到预期的命名备用方法。

默认情况下,此规则仅查看外部可见的类型,但这是可配置的。

规则说明

运算符重载允许使用符号来表示类型的计算。 例如,重载加号 + 以进行加法的类型通常会具有一个名为 Add 的备用成员。 命名的备用成员提供了对与运算符相同的功能的访问。 它针对相关开发人员提供,这些开发人员使用不支持重载运算符的语言进行编程。

此规则检查以下内容:

  • 通过检查名为 To<typename>From<typename> 的方法在类型中隐式和显式强制转换运算符。

  • 下表中列出了这些运算符:

C# Visual Basic C++ 替代方法名称
+(二元) + +(二元) 添加
+= += += 添加
& & BitwiseAnd
&= And= &= BitwiseAnd
| | BitwiseOr
|= Or= |= BitwiseOr
-- 不可用 -- 递减
/ / /
/= /= /=
== = == 等于
^ Xor ^ Xor
^= Xor= ^= Xor
> > > CompareTo 或 Compare
>= >= >= CompareTo 或 Compare
++ 不可用 ++ 增量
!= <> != 等于
<< << << LeftShift
<<= <<= <<= LeftShift
< < < CompareTo 或 Compare
<= <= <= CompareTo 或 Compare
&& 空值 && LogicalAnd
|| 空值 || LogicalOr
! 不可用 ! LogicalNot
% Mod % Mod 或 Remainder
%= 不可用 %= Mod
*(二进制) * *
*= 不可用 *=
~ Not ~ OnesComplement
>> >> >> RightShift
>>= 不可用 >>= RightShift
-(二元) -(二元) -(二元)
-= 不可用 -=
true IsTrue 不可用 IsTrue(属性)
- (unary) 不可用 - Negate
+(一元) 不可用 + Plus
false IsFalse False IsTrue(属性)

*N/A 表示运算符不能重载为所选的语言。

注意

在 C# 中,重载二元运算符时,也会隐式重载相应的赋值运算符(若有)。

如何解决冲突

若要解决此规则的冲突,请为运算符实现备用方法。 使用建议的备用名称为其命名。

何时禁止显示警告

如果要实现共享库,请勿禁止显示此规则的警告。 应用程序可以忽略此规则发出的警告。

抑制警告

如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。

#pragma warning disable CA2225
// The code that's violating the rule is on this line.
#pragma warning restore CA2225

若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none

[*.{cs,vb}]
dotnet_diagnostic.CA2225.severity = none

有关详细信息,请参阅如何禁止显示代码分析警告

配置代码以进行分析

使用下面的选项来配置代码库的哪些部分要运行此规则。

可以仅为此规则、为适用的所有规则或为适用的此类别(使用情况)中的所有规则配置此选项。 有关详细信息,请参阅代码质量规则配置选项

包含特定的 API 图面

你可以根据代码库的可访问性,配置要针对其运行此规则的部分。 例如,若要指定规则应仅针对非公共 API 图面运行,请将以下键值对添加到项目中的 .editorconfig 文件:

dotnet_code_quality.CAXXXX.api_surface = private, internal

示例

下面的示例定义了与此规则冲突的结构。 若要更正此示例,请向该结构添加公共 Add(int x, int y) 方法。

public struct Point
{
    private int x, y;

    public Point(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    public override string ToString()
    {
        return String.Format("({0},{1})", x, y);
    }

    // Violates rule: OperatorOverloadsHaveNamedAlternates.
    public static Point operator +(Point a, Point b)
    {
        return new Point(a.x + b.x, a.y + b.y);
    }

    public int X { get { return x; } }
    public int Y { get { return x; } }
}