0

質問を入力しているときに、演算子のオーバーロードのリストが表示されました...質問が並んでいます。それらのほとんどはC++またはHaskell用です。私の質問はC#に関するもので、ロジックは同じである可能性があります。そして私の問題は、C#コンテキストでの演算子のオーバーロードを理解したいということです。

私はチュートリアルを見ていました、そしてそれは示します、

DateTime dt1 = new DateTime();
//do some work
DateTime dt2 = new DateTime();
TimeSpan ts = dt2 - dt1;

そして著者は、-DateTimeデータ型内での利用が最良の演算子オーバーロードの例であると述べました。私が見ることができるのは、ある日付が別の日付に差し引かれ、TimeSpanオブジェクトに保存されることだけです。operatorキーワードもキーワードも使用していませんstatic

理解しにくいと思います。誰かがここで何が起こっているのか説明できますか?ts = dt2 - dt1上記の下にpublic static DateTime operator -(DateTime, DateTime)起こっているという意味ですか?

アップデート:

2番目の例:

//some parameterized constructor is here to set X, Y

public static Point operator +(Point p1, Point p2)
{   
    Point p = New Point();
    p.X = p1.X + p2.X;
    p.Y = p2.Y + p2.Y;
    return p
{

この場合、オペランドは戻り型と同じ型である必要がありますか?

4

3 に答える 3

9

operatorキーワードは、使用時ではなく、オーバーロードされた演算子を宣言するときに使用されます。

したがって、演算子は次のように記述されます。

public static TimeSpan operator -(DateTime lhs, DateTime rhs)
{
    // Code to execute
}

演算子を使用する場合、そのいずれも干渉しません。すでに示した種類のコードで使用するだけです。したがって、この行:

TimeSpan ts = dt2 - dt1;

上記のコードを呼び出します。

サンプルコード:

using System;

public class Int32Wrapper
{
    private readonly int value;
    public int Value { get { return value; } }

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

    public static Int32Wrapper operator +(Int32Wrapper lhs, Int32Wrapper rhs)
    {
        Console.WriteLine("In the operator");
        return new Int32Wrapper(lhs.value + rhs.value);
    }
}

class Test
{
    static void Main()
    {
        Int32Wrapper x = new Int32Wrapper(10);
        Int32Wrapper y = new Int32Wrapper(5);
        Int32Wrapper z = x + y;
        Console.WriteLine(z.Value); // 15
    }
}

あなたの質問の最後のビットに答えるために:

ts = dt2 - dt1上記の下にpublic static DateTime operator -(DateTime, DateTime)起こっているという意味ですか?

いいえ-DateTimeを返す減算演算子はありません-を返すDateTimeものだけがありますTimeSpan

編集:の2番目の例に関しては、 2つの値Pointを足し合わせるのは論理的に意味がないと思います。Pointたとえば、自宅の場所を職場の場所に追加すると、何が得られますか?Vectorタイプがある方がはるかに理にかなっています。

public static Vector operator -(Point p1, Point p2)
public static Vector operator +(Vector v1, Vector v2)
public static Point operator +(Point p1, Vector v1)
于 2013-02-27T15:55:57.577 に答える
3

次のようなクラス「Amount」があるとします。

public class Amount
{
    public int AmountInt { get; set; }
}

そして、そのクラスの2つのインスタンスがあります。

Amount am1 = new Amount { AmountInt = 2 };
Amount am2 = new Amount { AmountInt = 3 };

単純に行うことはできません。

Amount am3 = am1 + am2; //compilation error

この機能を提供するには、Amountクラスに演算子を追加する必要があります。

public static Amount operator +(Amount amount1, Amount amount2)
{
    return new Amount { AmountInt = amount1.AmountInt + amount2.AmountInt };
}

減算(-)についても同じことが言えます。今あなたがするなら:

Amount am3 = am1 + am2;

この場合、am3のint-valueプロパティは5になります。お役に立てれば!

于 2013-02-27T16:02:31.263 に答える
0

すべての演算子は、メソッドの構文糖衣です。たとえば、-演算子は似たようなものにすることができます

//not the actual syntax
public MyObject minus(MyObject object1, MyObject object2)
{
    //insert custom subtraction logic here
    return result
}

定義したカスタムクラスの演算子をオーバーロードできます。

これが私があなたに見つけたチュートリアルです実際にそれをします

これは、チュートリアルの最初の例からの関連する抜粋です

   // Declare which operator to overload (+), the types 
   // that can be added (two Complex objects), and the 
   // return type (Complex):
   public static Complex operator +(Complex c1, Complex c2) 
   {
      return new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary);
   }
于 2013-02-27T15:58:50.770 に答える