operator (C# リファレンス)operator (C# Reference)

operator キーワードを使用して、組み込みの演算子をオーバーロードしたり、クラスまたは構造体宣言内でユーザー定義の変換を行ったりすることができます。Use the operator keyword to overload a built-in operator or to provide a user-defined conversion in a class or struct declaration.

カスタム クラスまたは構造体上で演算子をオーバー ロードするには、対応する型で演算子の宣言を作成します。To overload an operator on a custom class or struct, you create an operator declaration in the corresponding type. 組み込みの C# 演算子をオーバーロードする演算子宣言は、次の規則を満たす必要があります。The operator declaration that overloads a built-in C# operator must satisfy the following rules:

  • これには、publicstatic 修飾子の両方が含まれています。It includes both a public and a static modifier.
  • これには operator X が含まれています。ここで、X は、オーバーロードされる演算子の名前またはシンボルです。It includes operator X where X is the name or symbol of the operator being overloaded.
  • 単項演算子にはパラメーターが 1 つ、2 項演算子にはパラメーターが 2 つあります。Unary operators have one parameter, and binary operators have two parameters. いずれの場合も、少なくとも 1 つのパラメーターが演算子を宣言するクラスまたは構造体と同じ型である必要があります。In each case, at least one parameter must be the same type as the class or struct that declares the operator.

変換演算子を定義する方法については、明示的なキーワード暗黙的なキーワードに関する記事を参照してください。For information about how to define conversion operators, see the explicit and implicit keyword articles.

オーバーロードできる C# 演算子の概要については、オーバーロード可能な演算子に関する記事を参照してください。For an overview of the C# operators that can be overloaded, see the Overloadable operators article.

Example

次の例では、小数部を表す Fraction 型が定義されています。The following example defines a Fraction type that represents fractional numbers. このクラスは、小数の加算および乗算を実行するために + 演算子および * 演算子をオーバーロードします。また、Fraction 型を double 型に変換する変換演算子も提供します。It overloads the + and * operators to perform fractional addition and multiplication, and also provides a conversion operator that converts a Fraction type to a double type.

class Fraction
{
    int num, den;
    public Fraction(int num, int den)
    {
        this.num = num;
        this.den = den;
    }

    // overload operator +
    public static Fraction operator +(Fraction a, Fraction b)
    {
        return new Fraction(a.num * b.den + b.num * a.den,
           a.den * b.den);
    }

    // overload operator *
    public static Fraction operator *(Fraction a, Fraction b)
    {
        return new Fraction(a.num * b.num, a.den * b.den);
    }

    // user-defined conversion from Fraction to double
    public static implicit operator double(Fraction f)
    {
        return (double)f.num / f.den;
    }
}

class Test
{
    static void Main()
    {
        Fraction a = new Fraction(1, 2);
        Fraction b = new Fraction(3, 7);
        Fraction c = new Fraction(2, 3);
        Console.WriteLine((double)(a * b + c));
    }
}
/*
Output
0.880952380952381
*/

C# 言語仕様C# language specification

詳細については、「C# 言語の仕様」を参照してください。For more information, see the C# Language Specification. 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。The language specification is the definitive source for C# syntax and usage.

関連項目See also