可重载运算符
C#允许用户定义的类型通过使用 operator
关键字定义静态成员函数来重载运算符。
以下示例说明了+
运算符的实现。
如果我们有一个表示复数的 Complex
类:
public struct Complex
{
public double Real { get; set; }
public double Imaginary { get; set; }
}
我们想要添加选项以在此类中使用+
运算符。即:
Complex a = new Complex() { Real = 1, Imaginary = 2 };
Complex b = new Complex() { Real = 4, Imaginary = 8 };
Complex c = a + b;
我们需要为该类重载+
运算符。这是使用静态函数和 operator
关键字完成的:
public static Complex operator +(Complex c1, Complex c2)
{
return new Complex
{
Real = c1.Real + c2.Real,
Imaginary = c1.Imaginary + c2.Imaginary
};
}
+
,-
,*
,/
等运算符都可能超载。这还包括不返回相同类型的运算符(例如,==
和 !=
可以重载,尽管返回布尔值)下面的规则也在这里强制执行。
比较运算符必须成对过载(例如,如果 <
过载,则 >
也需要过载)。
在 MSDN 上可以看到可重载运算符的完整列表(以及不可重载运算符和对某些可重载运算符的限制) - 可重载运算符(C#编程指南) 。
Version >= 7
使用 C#7.0 的模式匹配机制引入了 operator is
的重载。有关详细信息,请参阅模式匹配
给定类型 Cartesian
定义如下
public class Cartesian
{
public int X { get; }
public int Y { get; }
}
例如,可以为 Polar
坐标定义可重载的 operator is
public static class Polar
{
public static bool operator is(Cartesian c, out double R, out double Theta)
{
R = Math.Sqrt(c.X*c.X + c.Y*c.Y);
Theta = Math.Atan2(c.Y, c.X);
return c.X != 0 || c.Y != 0;
}
}
可以像这样使用
var c = Cartesian(3, 4);
if (c is Polar(var R, *))
{
Console.WriteLine(R);
}
(该示例取自 Roslyn 模式匹配文档 )