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)事情?

更新:

第二个例子:

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

编辑:关于你的第二个例子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

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

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

于 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 回答