演算子のオーバーロード使用方法のガイドライン
次の規則は、演算子のオーバーロードのガイドラインを示しています。
System.Decimal 構造体などの論理組み込み言語型の値型で演算子を定義します。
演算子のオーバーロード メソッドは、そのメソッドを定義したクラス内でだけサポートします。C# コンパイラでは、このガイドラインが適用されます。
共通言語仕様 (CLS: Common Language Specification) に規定されている名前とシグネチャの規則を使用します。これは、C# コンパイラにより自動的に行われます。
演算の結果がすぐに明確にわかる場合に、演算子のオーバーロードを使用します。たとえば、ある Time 値を別の Time 値から引いて TimeSpan を取得できるようにすることには意味があります。しかし、or 演算子を使用して 2 つのデータベース クエリの和集合を作成したり、shift を使用してストリームに書き込みを行うことは適切ではありません。
演算子は、対称的な方法でオーバーロードします。たとえば、等値演算子 (==) をオーバーロードする場合は、否定等値演算子 (!=) もオーバーロードする必要があります。
代替のシグネチャを提供します。ほとんどの言語は、演算子のオーバーロードをサポートしていません。このため、演算子をオーバーロードするすべての型に対し、ドメイン固有の適切な名前で、同等の機能を持つ 2 番目のメソッドを含めることが CLS では必須です。この二次的なメソッドの用意は CLS に規定されている要件です。次の例は、CLS 準拠です。
public struct DateTime { public static TimeSpan operator -(DateTime t1, DateTime t2) { } public static TimeSpan Subtract(DateTime t1, DateTime t2) { } }
演算子記号と、それに対応する代替メソッドおよび演算子名の一覧を次の表に示します。
C++ 演算子記号 | 代替メソッド名 | 演算子名 |
---|---|---|
定義なし | ToXxx または FromXxx | op_Implicit |
定義なし | ToXxx または FromXxx | op_Explicit |
+ (二項) | Add | op_Addition |
- (二項) | Subtract | op_Subtraction |
* (二項) | Multiply | op_Multiply |
/ | Divide | op_Division |
% | Mod | op_Modulus |
^ | Xor | op_ExclusiveOr |
& (二項) | BitwiseAnd | op_BitwiseAnd |
| | BitwiseOr | op_BitwiseOr |
&& | And | op_LogicalAnd |
|| | Or | op_LogicalOr |
= | Assign | op_Assign |
<< | LeftShift | op_LeftShift |
>> | RightShift | op_RightShift |
定義なし | LeftShift | op_SignedRightShift |
定義なし | RightShift | op_UnsignedRightShift |
== | Equals | op_Equality |
> | Compare | op_GreaterThan |
< | Compare | op_LessThan |
!= | Compare | op_Inequality |
>= | Compare | op_GreaterThanOrEqual |
<= | Compare | op_LessThanOrEqual |
*= | Multiply | op_MultiplicationAssignment |
-= | Subtract | op_SubtractionAssignment |
^= | Xor | op_ExclusiveOrAssignment |
<<= | LeftShift | op_LeftShiftAssignment |
%= | Mod | op_ModulusAssignment |
+= | Add | op_AdditionAssignment |
&= | BitwiseAnd | op_BitwiseAndAssignment |
|= | BitwiseOr | op_BitwiseOrAssignment |
, | 割り当てなし | op_Comma |
/= | Divide | op_DivisionAssignment |
-- | Decrement | op_Decrement |
++ | Increment | op_Increment |
- (単項) | Negate | op_UnaryNegation |
+ (単項) | Plus | op_UnaryPlus |
~ | OnesComplement | op_OnesComplement |