类型的运算符重载

时间:2013-02-27 15:53:39

标签: c# operator-overloading

当我输入问题时,我可以看到列出的运算符重载... 问题列表。其中大多数是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)

更新

第二个例子:

//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
{

在这种情况下,操作数必须与返回类型相同?

3 个答案:

答案 0 :(得分:9)

声明重载运算符时使用operator关键字,而不是使用时。{/ p>

所以运营商会这样写:

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的运算符。

编辑:关于您使用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)

答案 1 :(得分:3)

假设您有一个“金额”类,如下所示:

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

你有两个类的实例:

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。希望这有帮助!

答案 2 :(得分:0)

所有运算符都是方法的语法糖。例如 - 运算符可以是某种类似的

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

您可以为您定义的任何自定义类重载运算符。

here's a tutorial I found on you actually do it

这是教程第一个例子中的相关信息

   // 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);
   }