ลำดับของคลาสตัวถูกดำเนินการและ enum (int) เมื่อโอเวอร์โหลดตัวดำเนินการใน C #

ในภาษา C++ ลำดับการประเมินตัวถูกดำเนินการคือ ไม่ระบุ ฉันต้องระวังอะไรบ้างเมื่อพยายามโอเวอร์โหลดตัวดำเนินการใน C#

class A{

  public static A operator +(A left, int right){
    left.someVariable += right;
    return left;
  }

  public static A operator +(A left, B right){
    var x = 1<<right; // Just to clarify that it might not be a simple int + int operation
    left.someVariable += x;
    return left;
  }
}
enum B{a=0,b=1,c=2}

var a = new A()+B.a+B.b+B.c;//I want this to be operator+(A,1<<0 + 1<<1 + 1<<2)
var b = (new A()+B.a)+B.b+B.c;//as well as this
var c = ((new A()+B.a)+B.b)+B.c;//and this

Resharper บอกฉันว่าฉันสามารถลบวงเล็บใน var b=... และ var c=... ได้ แต่ฉันไม่แน่ใจว่ามันถูกต้องหรือไม่ เนื่องจากฉันไม่แน่ใจว่ารับประกันว่าจะโทรหาโอเปอเรเตอร์ที่โอเวอร์โหลดเสมอ +(A,B) และไม่ได้ประเมินสิ่งนี้เป็นที่ไหน

var d = new A()+((int)B.a+((int)B.b+(int)B.c)); //operator+(A, 0+1+2)

อัปเดต

ข้อมูลต่อไปนี้มาจากข้อกำหนดภาษา C และไม่ถือเป็น C# ตามที่ PetSerAl ชี้ให้เห็น

กำลังอ่าน: ลำดับความสำคัญและลำดับการประเมิน ฉันค่อนข้างแน่ใจ a,b,c ไม่รับประกันว่าจะถูกประเมินจากซ้ายไปขวา

ทิศทางของการประเมินไม่ส่งผลต่อผลลัพธ์ของนิพจน์ที่มีการคูณ (*) การบวก (+) หรือตัวดำเนินการไบนารีบิต (& | ^) มากกว่าหนึ่งตัวในระดับเดียวกัน ลำดับการดำเนินการไม่ได้ถูกกำหนดโดยภาษา คอมไพลเลอร์มีอิสระที่จะประเมินนิพจน์ดังกล่าวในลำดับใดก็ได้ หากคอมไพเลอร์สามารถรับประกันผลลัพธ์ที่สอดคล้องกันได้


person Kevin Streicher    schedule 28.09.2017    source แหล่งที่มา
comment
ใน C# + ได้ทิ้งการเชื่อมโยงไว้ ดังนั้น a+b+c จึงเทียบเท่ากับ (a+b)+c แต่ IMHO สำคัญกว่านั้น: ตัวดำเนินการไม่ควรทำการเปลี่ยนแปลงข้อโต้แย้งที่มองเห็นได้   -  person user4003407    schedule 28.09.2017
comment
@PetSerAl แต่ข้อความที่ยกมาจากไซต์ msdna ไม่ได้บอกอย่างชัดเจนว่าสิ่งนี้ไม่ถือเป็นตัวดำเนินการเพิ่มเติมมากกว่าหนึ่งตัวในระดับเดียวกันใช่หรือไม่   -  person Kevin Streicher    schedule 28.09.2017
comment
การอ้างอิงนั้นมาจากภาษา C แต่ไม่ใช่ C#   -  person user4003407    schedule 28.09.2017
comment
@PetSerAl บางครั้งฉันก็รู้สึกโง่ธรรมดา ฉันอ่านแล้ว - แต่ไม่ได้ประมวลผล หากคุณโพสต์สิ่งนั้นเป็นคำตอบฉันจะยอมรับมัน   -  person Kevin Streicher    schedule 29.09.2017


คำตอบ (1)


จาก ร่างสุดท้ายของ ECMA ฉบับที่ 2

เมื่อตัวถูกดำเนินการเกิดขึ้นระหว่างตัวดำเนินการสองตัวที่มีลำดับความสำคัญเท่ากัน ความสัมพันธ์ของตัวดำเนินการจะควบคุมลำดับการดำเนินการ: * ยกเว้นตัวดำเนินการที่ได้รับมอบหมายและตัวดำเนินการรวมค่าว่าง ตัวดำเนินการไบนารีทั้งหมดจะเชื่อมโยงด้านซ้าย ซึ่งหมายความว่าการดำเนินการ จะดำเนินการจากซ้ายไปขวา

x + y + z

ได้รับการประเมินว่าเป็น

(x + y) + z.

  • ตัวดำเนินการที่ได้รับมอบหมาย ตัวดำเนินการรวมค่า null และตัวดำเนินการแบบมีเงื่อนไข (?:) มีความสัมพันธ์ทางขวา ซึ่งหมายความว่าการดำเนินการจะดำเนินการจากขวาไปซ้าย

x = y = z

ได้รับการประเมินว่าเป็น

x =(y= z).

ลำดับความสำคัญและการเชื่อมโยงสามารถควบคุมได้โดยใช้วงเล็บ

x + y * z

ขั้นแรกให้คูณ y ด้วย z แล้วบวกผลลัพธ์เข้ากับ x แต่

(x + y) * z

ขั้นแรกให้บวก x และ y แล้วคูณผลลัพธ์ด้วย z

person Kevin Streicher    schedule 29.09.2017