重載操作符
要求重載方法的參數至少有一個參數與重載方法的類型一樣。
運算符參數不能使用ref/out修飾符。
需許要注意的要點如下:
&&和||不能被直接重載,但使用&和|進入計算則可以被重載
[ ]不能被重載,可以使用索引器來代替它完成所需操作
( )不能被重載,代替此運算符的方式是定義新的轉換運算符 ,即隐式/顯示轉換運算符
邏輯運算符必須成對重載==和!=
指派運算符=不能被重載, +=也屬于指派運算符

//operator是運算符重載的關鍵字

//重載二進制運算符

public static ThreeD operator +(ThreeD op1, ThreeD op2)
{
ThreeD result = new ThreeD();
result.x = op1.x + op2.x;
result.y = op1.y + op2.y;
result.z = op1.z + op2.z;
return result;
}


//可以多次重載同一運算符

public static ThreeD operator -(ThreeD op1, ThreeD op2)
result.x = op1.x - op2.x;
result.y = op1.y - op2.y;
result.z = op1.z - op2.z;


//重載一進制運算符

public static ThreeD operator -(ThreeD op)
result.x = -op.x;
result.y = -op.y;
result.z = -op.z;
對象+整型 與 整型 + 對象 是不一樣的,是以要重載兩次:

public static ThreeD operator +(ThreeD op1, int op2)
result.x = op1.x + op2;
result.y = op1.y + op2;
result.z = op1.z + op2;


public static ThreeD operator +(int op1, ThreeD op2)
result.x = op1 + op2.x;
result.y = op1 + op2.y;
result.z = op1 + op2.z;
重載關系運算符要“成對重載”,比如說<和>,不能隻重載其中重載一個。先重載<,然後可以利用<重載>:

public static bool operator <(ThreeD op1, ThreeD op2)
if ((op1.x < op2.x) && (op1.y < op2.y) && (op1.z < op2.z))
return true;
}
else
return false;


public static bool operator >(ThreeD op1, ThreeD op2)
if (op1 < op2)
關系運算符==,重載時候需要同時覆寫Equal(object)方法和GetHashCode()方法,如下:
public static bool operator ==(ThreeD a, ThreeD b)
// If both are null, or both are same instance, return true.
if (System.Object.ReferenceEquals(a, b))
// If one is null, but not both, return false.
if (((object)a == null) || ((object)b == null))
// Return true if the fields match:
return a.x == b.x && a.y == b.y && a.z == b.z;
public static bool operator !=(ThreeD op1, ThreeD op2)
return !(op1 == op2);
public override bool Equals(Object obj)
if (obj == null)
ThreeD p = obj as ThreeD;
if ((object)p == null)
return ((this.x == p.x) && (this.y == p.y) && (this.z == p.z));
public override int GetHashCode()
return x ^ y ^ z;
重載true和false,也要成對出現,同上。可以認為true/false也是運算符。
重載邏輯運算符,一共5個:& | ! && ||
!隻是對true的取反,很容易實作。
&&與||是不能被重載的,編譯器會報錯。隻有通過實作&與|的重載,還要實作true與false的重載,同時滿足:
重載的&與|的傳回類型與參數類型必須是 重載運算符的類型。
實作如下:ThreeD定義見前面
public static ThreeD operator &(ThreeD op1, ThreeD op2)
if ((op1.x != 0) && (op1.y != 0) && (op1.z != 0) &
(op2.x != 0) && (op2.y != 0) && (op2.z != 0)
)
return new ThreeD(1, 1, 1);
return new ThreeD(0, 0, 0);
這樣,&&與||對象自動可用,操作如下:如果重載的true(對應||)或false(對應&&)檢驗第一個操作數,如果它能确定運算的結果,那麼直接傳回,否則,使用相應的重載&或|來判斷結果——短路運算符的原理。
轉換運算符:
有兩種:隐式(implicit)和顯示(explicit)
implicit轉換,自動調用轉換方法。
explicit轉換,要強制轉換類型。
public static implicit operator int(ThreeD op)
return op.x * op.y * op.z;
public static explicit operator String(ThreeD op)
return op.x.ToString() + op.y.ToString() + op.z.ToString();
static void Main(string[] args)
int i = c;
String s = (String)c;
轉換操作符的限制:
不能定義從double到int的類型轉換,可以實作自定義類型與系統類型的轉換。
不能定義Object和其他自定義類型的轉換。
不能給相同的源和目标同時定義implicit和explicit轉換。
不能定義基類到派生類的轉換。
不能定義接口到其他類型的轉換。
implicit和explicit的選擇:
隐式轉換至用于與在轉換不會引起錯誤的環境,滿足以下兩條才建立隐式轉換:
1.不丢失資訊,如截斷/溢出/丢失正負号
2.轉換不會引起異常。
複合運算符不能被重載,因為它們總是被分解開來,如+= ,但是,如果已經重載了+,那麼+=就自動可以使用