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)
在这种情况下,操作数必须与返回类型相同?
在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)