类型的运算符重载

asp*_*ing 0 c# operator-overloading

当我输入问题时,我可以看到运算符重载列表...问题排成一行.其中大多数是C++或Haskell.我的问题是C#,可以说逻辑可能是相同的.我的问题是我想了解C#上下文中的运算符重载.

我正在看一个教程,它显示,

DateTime dt1 = new DateTime();
//do some work
DateTime dt2 = new DateTime();
TimeSpan ts = dt2 - dt1;
Run Code Online (Sandbox Code Playgroud)

作者说,使用-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
{
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 9

operator当关键字用于声明重载的运算符,而不是当使用它.

所以运算符会这样写:

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

当您使用运算符时,这些都不会干扰- 您只需在已经显示的代码中使用它.所以这一行:

TimeSpan ts = dt2 - dt1;
Run Code Online (Sandbox Code Playgroud)

将调用上面给出的代码.

示例代码:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

要回答你问题的最后一点:

这是否意味着在上面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)
Run Code Online (Sandbox Code Playgroud)