使用 operator 关键字来重载内置运算符,或提供类或结构声明中的用户定义转换。
C#中,操作符都是一些静态方法,其返回值表示操作结果,其参数是操作数.当我们为一个类创建操作符时,我们称为"重载(OverLoad)"该操作符,与成员方法重载很像.要重载加法操作符(+),应这样写:
public static Fraction operator+(Fraction lhs,Fraction rhs);
将参数取名为lhs和rhs是我的习惯,参数名lhs代表"lefthand side"(左手边),这样可以提醒我第一参数代表操作的左边.类似的,rhs代表"righthand side"(右手边).
C#的操作符号重载语法是在要重载的操作符后写上关键字operator.该关键字是一个方法修饰符.因此要重载加法操作符(+),应写成operator+.
C#可以隐式地将int转换long,并允许显式地将long转换为int.int到long是隐式转换,因为任何int都可以适应long的内存表示.而逆操作,从long到int,必须是显式的(要用强制转换操作符),因为转换可能使信息丢失:
int myInt = 5;
long myLong;
myLong = myInt; //隐式
myInt = (int) myLong; //显式
对分数可能也需要相同的功能.对于给定的int,可以支持隐式的转换为分数,因为整数值等于值除以1(如 15= =15/1).
对于给定分数,可以提供显式转换为整数,只要允许值可以取整.因此,9/4可以转换为整数值2.
提示:关键字implicit用于转换肯定成功,不会丢失信息的时候;否则就用explicit.
public static implicit operator Fraction(int theInt){
return new Fraction(theInt);
}
public static explicit operator int(Fraction theFraction){
return theFraction.numerator/theFraction.denominator;
}
转换操作符号后是等于操作符(==)和不等于操作符(!=).请记住,如果实现了其中一个,必须实现另一个.
public static bool operator ==(Fraction lhs,Fraction rhs){
Console.WriteLine("In operator ==");
if (lhs.denominator == rhs.denominator && lhs.numerator == rhs.numerator)
return true;
return false;
}
public static bool operator !=(Fraction lsh,Fraction rhs){
Console.WriteLine("In operator !=");
return !(lhs == rhs);
}