c# オペレータのオーバライド

c++ 同様、演算子のオーバライドができます。1例として加算は以下のとおり。

class MyInt
{
  private int value;

  public MyInt(int value)
  {
    this.value = value;
  }

  public void Print()
  {
    Console.WriteLine(value);
  }

  public static MyInt operator+(MyInt a, MyInt b) {
    return new MyInt(a.value + b.value);
  }

  public static void Test()
  {
    MyInt a = new MyInt(3);
    MyInt b = new MyInt(4);
    MyInt c = a + b;
    c.Print();
  }
};

イコール(==)、ノットイコール(!=) のオーバライドは以下の様に行います。 Equals と、GetHashCode もオーバライドしないとコンパイラが文句を言います。

public override bool Equals(Object o)
{
  if (!(o is MyInt))
    return false;
  return this == (MyInt)o;
}

public override int GetHashCode()
{
  return value;
}

public static bool operator==(MyInt a, MyInt b) 
{
  return a.value == b.value;
}
  
public static bool operator!=(MyInt a, MyInt b) 
{
  return ! (a.value == b.value);
}

キャスト演算子のオーバライドは以下のとおり。
明示的なキャストが必要な場合は explicit、自動的に変換して良い場合は implicit キーワードを使用します。

public static explicit operator MyInt(int value)
{
  return new MyInt(value);
}

public static implicit operator int(MyInt x)
{
  return x.value;
}

public static void TestCast()
{
  MyInt b = (MyInt)4;
  // MyInt b = 4; // コンパイルエラーになる

  MyInt a = new MyInt(3);
  int aInt = a; // OK
}

インタフェースを複数継承してメソッドの名前と型が衝突している場合に、 2番目以降の実装を明示する必要があります。

interface ICollTestA
{
  void Print();
};

interface ICollTestB
{
  void Print();
};

class CollTest : ICollTestA, ICollTestB
{
  public void Print()
  {
    Console.WriteLine("Print");
  }
  void ICollTestB.Print()
  {
    Console.WriteLine("PrintB");
  }
  public static void Test()
  {
    CollTest a = new CollTest();
    a.Print(); // Print が出力される
    ICollTestB b = a;
    b.Print(); // PrintB が出力される
  }
};

となりのページ

このサイトについて

このサイトのページへのリンクは自由に行っていただいてかまいません。
このサイトで公開している全ての画像、プログラム、文書の無断転載を禁止します。

連絡先

ここをクリック すると表示されるページから作者へメールで連絡できます。

共有