通过


CA2225:运算符重载具有具名的替代方法

属性
规则 ID CA2225
标题 运算符重载具有命名的替代方案
类别 使用情况
修复会引起中断还是不会引起中断 非中断
在 .NET 10 中默认启用
适用的语言 C# 和 Visual Basic

原因

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

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

规则说明

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

此规则检查以下内容:

  • 通过检查类型中是否存在名为To<typename>From<typename>的方法来识别隐式和显式转换运算符。

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

C# Visual Basic C++ 替代方法名称
+(二元) + +(二进制) 添加
+= += += 添加
" & BitwiseAnd
%> And= %> BitwiseAnd
| | BitwiseOr
|= 或= |= BitwiseOr
-- 不可用 -- 递减
/ / /
/= /= /=
== = == 等于
^ Xor ^ Xor
^= Xor= ^= Xor
> > > CompareTo 或 Compare
>= >= >= CompareTo 或 Compare
++ 不可用 ++ 增量
!= <> != 等于
<< << << 左移位
<<= <<= <<= LeftShift
< < < CompareTo 或 Compare
<= <= <= CompareTo 或 Compare
%> 不可用 %> LogicalAnd
|| 不可用 || LogicalOr
" 不可用 " LogicalNot
% Mod % Mod 或 Remainder
%= 不可用 %= 模组
*(二进制) * *
*= 不可用 *=
~ ~ OnesComplement
>> >> >> RightShift
>>= 不可用 >>= RightShift
-(二元) -(二元) -(二元)
-= 不可用 -=
true IsTrue 不可用 IsTrue(属性)
- (一元) 不可用 - Negate
+(一元) 不可用 + Plus
false IsFalse 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_surface 选项来配置要基于可访问性对代码库的哪些部分运行此规则。 例如,若要指定规则应仅针对非公共 API 图面运行,请将以下键值对添加到项目中的 .editorconfig 文件:

dotnet_code_quality.CAXXXX.api_surface = private, internal

注意

XXXXCAXXXX 部分替换为适用规则的 ID。

示例

下面的示例定义了与此规则冲突的结构。 若要更正此示例,请向该结构添加公共 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; } }
}