C#賦值運(yùn)算符之復(fù)合賦值運(yùn)算符
C#賦值運(yùn)算符之復(fù)合賦值運(yùn)算符的使用:
x op= y 形式的運(yùn)算是這樣來處理的:先將二元運(yùn)算符重載決策應(yīng)用于運(yùn)算 x op y。然后,
如果選定的運(yùn)算符的返回類型可“隱式”轉(zhuǎn)換為 x 的類型,則運(yùn)算按 x = x op y 計(jì)算,但 x 只計(jì)算一次。
否則,如果選定運(yùn)算符是預(yù)定義的運(yùn)算符,選定運(yùn)算符的返回類型可“顯式”轉(zhuǎn)換為 x 的類型,并且 y 可“隱式”轉(zhuǎn)換為 x 的類型,則運(yùn)算按 x = (T)(x op y) 計(jì)算(其中 T 是 x 的類型),但 x 只計(jì)算一次。
否則,復(fù)合賦值無效,且發(fā)生編譯時(shí)錯(cuò)誤。
C#賦值運(yùn)算符之復(fù)合賦值運(yùn)算符使用遇到的問題:
術(shù)語“只計(jì)算一次”表示:在 x op y 的計(jì)算中,任何 x 的要素表達(dá)式的計(jì)算結(jié)果都臨時(shí)保存起來,然后在執(zhí)行對(duì) x 的賦值時(shí)重用這些結(jié)果。例如,在計(jì)算賦值 A()[B()] += C() 時(shí)(其中 A 為返回 int[] 的方法,B 和 C 為返回 int 的方法),按 A、B、C 的順序只調(diào)用一次這些方法。
當(dāng)復(fù)合賦值的左操作數(shù)為屬性訪問或索引器訪問時(shí),屬性或索引器必須同時(shí)具有 get 訪問器和 set 訪問器。如果不是這樣,則發(fā)生編譯時(shí)錯(cuò)誤。
上面的第二條規(guī)則允許在某些上下文中將 x op= y 按 x = (T)(x op y) 計(jì)算。按此規(guī)則,當(dāng)左操作數(shù)為 sbyte、byte、short、ushort 或 char 類型時(shí),預(yù)定義的運(yùn)算符可用來構(gòu)造復(fù)合運(yùn)算符。甚至當(dāng)兩個(gè)參數(shù)都為這些類型之一時(shí),預(yù)定義的運(yùn)算符也產(chǎn)生 int 類型的結(jié)果.因此,不進(jìn)行強(qiáng)制轉(zhuǎn)換,就不可能把結(jié)果賦值給左操作數(shù)。
C#賦值運(yùn)算符之復(fù)合賦值運(yùn)算符使用的實(shí)例操作:
此規(guī)則對(duì)預(yù)定義運(yùn)算符的直觀效果只是:如果同時(shí)允許 x op y 和 x = y,則允許 x op= y。在下面的示例中,
- byte b = 0;
- char ch = '\0';
- int i = 0;
- b += 1; // Ok
- b += 1000; // Error, b = 1000 not permitted
- b += i; // Error, b = i not permitted
- b += (byte)i; // Ok
- ch += 1; // Error, ch = 1 not permitted
- ch += (char)1; // Ok
每個(gè)錯(cuò)誤的直觀理由是對(duì)應(yīng)的簡(jiǎn)單賦值也發(fā)生錯(cuò)誤。
C#賦值運(yùn)算符之復(fù)合賦值運(yùn)算符的相關(guān)內(nèi)容就向你介紹到這里,希望對(duì)你學(xué)習(xí)C#賦值運(yùn)算符之復(fù)合賦值運(yùn)算符有所幫助。
【編輯推薦】