ในภาษา 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 ไม่รับประกันว่าจะถูกประเมินจากซ้ายไปขวา
ทิศทางของการประเมินไม่ส่งผลต่อผลลัพธ์ของนิพจน์ที่มีการคูณ (*) การบวก (+) หรือตัวดำเนินการไบนารีบิต (& | ^) มากกว่าหนึ่งตัวในระดับเดียวกัน ลำดับการดำเนินการไม่ได้ถูกกำหนดโดยภาษา คอมไพลเลอร์มีอิสระที่จะประเมินนิพจน์ดังกล่าวในลำดับใดก็ได้ หากคอมไพเลอร์สามารถรับประกันผลลัพธ์ที่สอดคล้องกันได้
+
ได้ทิ้งการเชื่อมโยงไว้ ดังนั้นa+b+c
จึงเทียบเท่ากับ(a+b)+c
แต่ IMHO สำคัญกว่านั้น: ตัวดำเนินการไม่ควรทำการเปลี่ยนแปลงข้อโต้แย้งที่มองเห็นได้ - person user4003407   schedule 28.09.2017C
แต่ไม่ใช่C#
- person user4003407   schedule 28.09.2017