標籤:class 過程 implicit 執行 編譯 ret 必須 運算子多載 pretty
operator 關鍵字用於在類或結構聲明中聲明運算子。運算子聲明可以採用下列四種形式之一:
public static result-type operator unary-operator ( op-type operand )public static result-type operator binary-operator ( op-type operand, op-type2 operand2 )public static implicit operator conv-type-out ( conv-type-in operand )public static explicit operator conv-type-out ( conv-type-in operand )
參數:
- result-type 運算子的結果類型。
- unary-operator 下列運算子之一:+ - ! ~ ++ — true false
- op-type 第一個(或唯一一個)參數的類型。
- operand 第一個(或唯一一個)參數的名稱。
- binary-operator 其中一個:+ - * / % & | ^ < < >> == != > <>= < =
- op-type2 第二個參數的類型。
- operand2 第二個參數的名稱。
- conv-type-out 類型轉換運算子的目標類型。
- conv-type-in 類型轉換運算子的輸入類型。
注意:
前兩種形式聲明了使用者定義的重載內建運算子的運算子。並非所有內建運算子都可以被重載(請參見可重載的運算子)。op-type 和 op-type2 中至少有一個必須是封閉類型(即運算子所屬的類型,或理解為自訂的類型)。例如,這將防止重定義整數加法運算子。
後兩種形式聲明了轉換運算子。conv-type-in 和 conv-type-out 中正好有一個必須是封閉類型(即,轉換運算子只能從它的封閉類型轉換為其他某個類型,或從其他某個類型轉換為它的封閉類型)。
運算子只能採用值參數,不能採用 ref 或 out 參數。
C# 要求成對重載比較子。如果重載了==,則也必須重載!=,否則產生編譯錯誤。同時,比較子必須返回bool類型的值,這是與其他算術運算子的根本區別。
C# 不允許重載=運算子,但如果重載例如+運算子,編譯器會自動使用+運算子的重載來執行+=運算子的操作。
運算子多載的其實就是函數重載。首先通過指定的運算運算式調用對應的運算子函數,然後再將運算對象轉化為運算子函數的實參,接著根據實參的類型來確定需要調用的函數的重載,這個過程是由編譯器完成。
c# 運算子多載