CA2225:运算符重载具有命名的备用项
属性 | 值 |
---|---|
规则 ID | CA2225 |
标题 | 运算符重载具有命名的备用项 |
类别 | 使用情况 |
修复是中断修复还是非中断修复 | 非中断 |
在 .NET 9 中默认启用 | 否 |
原因
检测到运算符重载,但未找到预期的命名备用方法。
默认情况下,此规则仅查看外部可见的类型,但这是可配置的。
规则说明
运算符重载允许使用符号来表示类型的计算。 例如,重载加号 +
以进行加法的类型通常会具有一个名为 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; } }
}