当我输入问题时,我可以看到列出的运算符重载... 问题列表。其中大多数是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
{
在这种情况下,操作数必须与返回类型相同?
答案 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);
}