Dalam C++ urutan evaluasi operan tidak ditentukan, apa yang perlu saya waspadai ketika saya mencoba membebani operator di 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 memberi tahu saya bahwa saya dapat menghapus tanda kurung di var b=...
dan var c=...
, tetapi saya tidak yakin apakah itu benar, karena saya tidak yakin apakah dijamin untuk selalu memanggil operator yang kelebihan beban +(A,B) dan tidak mengevaluasi ini sebagai suatu tempat
var d = new A()+((int)B.a+((int)B.b+(int)B.c)); //operator+(A, 0+1+2)
Perbarui
Berikut ini adalah spesifikasi bahasa C dan tidak berlaku untuk C# seperti yang ditunjukkan oleh PetSerAl.
Bacaan: Prioritas dan Urutan Evaluasi Saya cukup yakin a,b,c tidak dijamin akan dievaluasi dari kiri ke kanan.
Arah evaluasi tidak mempengaruhi hasil ekspresi yang menyertakan lebih dari satu operator perkalian (*), penjumlahan (+), atau biner-bitwise (& | ^) pada level yang sama. Urutan operasi tidak ditentukan oleh bahasa. Kompiler bebas mengevaluasi ekspresi tersebut dalam urutan apa pun, jika kompiler dapat menjamin hasil yang konsisten.
+
memiliki asosiatif kiri, jadia+b+c
setara dengan(a+b)+c
. Tapi, IMHO, yang lebih penting: operator tidak boleh membuat perubahan nyata dalam argumen. - person user4003407   schedule 28.09.2017C
, tetapi bukanC#
. - person user4003407   schedule 28.09.2017