elementlarga obuna bo'lganda nima uchun teng ishlamaydi?

intga tushganimda va ularni almashtirish uchun suzaman va ularni tenglashtirsam doim tenglik yolg'ondir. Nima uchun?

        float f = 0.0f;
        int i = 0;
        Console.WriteLine(f.Equals(i));//true
        Console.WriteLine(i.Equals(f));//false
        Console.WriteLine(i == f);//true
        Console.WriteLine("----------------");
        object obf = f;
        object obi = i;
        Console.WriteLine(obf.Equals(obi));//false
        Console.WriteLine(obi.Equals(obf));//false
        Console.WriteLine(obi == obf);//false
        Console.WriteLine("----------------");

Yangilash: bu bir xil turdagi holat emas

        int i1 = 1;
        int i2 = 1;
        object oi1 = i1;
        object oi2 = i2;
        Console.WriteLine(oi1.Equals(oi2));//true
        Console.WriteLine(oi2.Equals(oi1));//true
6

8 javoblar

float faqat boshqa float ga teng va int faqat boshqa int ga teng. true qaytgan yagona satrlar quyidagilar:

Console.WriteLine(f.Equals(i));
Console.WriteLine(i == f);

Ikkala holatda ham i qiymatini float ga aylantirildi, shuning uchun bunga teng:

Console.WriteLine(f.Equals((float) i));
Console.WriteLine((float) i == f);

Ushbu konvertatsiya usul va operatorlarning haddan tashqari yuklanishini talab qilish uchun oddiy konvertatsiya.

Qolgan qismlarning hech biri shu konvertatsiya qilishni o'z ichiga olmaydi, shuning uchun ular qiymati bilan taqqoslaganda ham false natijasini keltiradigan ikkita turni taqqoslaydi. barcha Equals chaqiruvlari bilan bog'liq). Shu sababli Tenglar dan foydalanilgan int qiymatlari qiymatini true qaytaradi, chunki u bir xil turdagi ikki qiymatni taqqoslaydi , qiymati bo'yicha .

Ushbu holatda:

Console.WriteLine(obi == obf);

raqamli qadriyatlarni solishtirishga urinmasa ham, kutubdagi ob'ektlar uchun mos yozuvlarlarini bilan taqqoslaydi. Ikki xil mos yozuvlar bo'lgani uchun, natija FALSE - va har ikkala qiymat ham int turi bo'lsa ham bo'ladi.

10
qo'shib qo'ydi
@CharlesLambert: Ha. IL ga bir qarang va uni amalga oshirilganini ko'rasiz.
qo'shib qo'ydi muallif Jon Skeet, manba
yopiq konvertatsiya derleme vaqtida ko'rib chiqiladimi?
qo'shib qo'ydi muallif Charles Lambert, manba

Boshqalar nima uchun == ni moslamangizda kutilganidek ishlamayotganligini tushuntirgan.

O'zgartirishingizga kelsak: oi1.Equals (oi2) ishlaydi, chunki Tenglik - bu virtual funktsiya va shuning uchun Int32.Equals (ob'ekt) chaqiriladi.

haqiqiy agar obj Int32 misoli bo'lsa va bu misolning qiymatiga teng bo'lsa; aks holda, FALSE .

Bu esa obi.Equals (obf)) nima uchun noto'g'ri ekanligini bildiradi: obf Int32 misoli emas.

3
qo'shib qo'ydi

Siz int ga boksasiz va ob'ektga suzib kirasiz, ya'ni ularni mos yozuvlar sifatida taqqoslash mumkin. Ular xuddi shu ob'ektga murojaat qilmaganlari uchun, ular teng emas.

See http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx

1
qo'shib qo'ydi

Ikkita narsani e'lon qilganingizda ular boshqa xotira manziliga murojaat qiladilar:

object obf = f;        //this simplified as new float(f)
object obi = i;        //this simplified as new int(i)

lekin quyidagi amalni sinab ko'ring, bir ob'ektga boshqasiga murojaat qilishiga ruxsat bering:

obf = obi;
Console.WriteLine(obf.Equals(obi));

MSDN, Object.Equals Method

Tenglikni standart bajarish uchun mos yozuvlar tengligini qo'llaydi   mos yozuvlar turlari va qiymatlar uchun bitwise tengligi. Malumot   tenglik, taqqoslanadigan ob'ekt murojaatlarining ma'nosini bildiradi   bir xil ob'ekt. Bitsel tenglik, solishtiriladigan moslamalarni bildiradi   bir xil ikkilik namoyish.

1
qo'shib qo'ydi

Qutb qutisi qiymatlari haqida ko'proq ma'lumot olish uchun, Shivprasad buni juda qisqacha tushuntiradi:

Boks va qutqarish

Siz qiymat turlarini moslamalarga boks qilganingiz uchun endi siz mos yozuvlar tengligini amalga oshiryapsiz. Endi sizning misolingizdagi turli xil xotira joylarida yashaganliklari sababli, ular yolg'onchi bo'ladi.

1
qo'shib qo'ydi

Equals ob'ekt mos yozuvlar manzilini solishtiradi va ikki raqam turli joylarda saqlanganligi uchun. Agar ikki qiymat turini taqqoslasangiz, teng, u float, int, string va boshqa turlari uchun bekor qilinganidek, to'g'ri ishlaydi.

0
qo'shib qo'ydi

Chunki ular turli memeuar hujayralarga tayinlangan. 2 ta ob'ekt = = bir xil ob'ekt bo'lganida. Float va int qismlarida siz 2 parametrni sinab ko'rganingizda, haqiqiy vaqtni olasiz, chunki ish vaqti ularning qiymatini tekshiradi. hammasi shu!

0
qo'shib qo'ydi

Ob'ektga qiymat turini kiritganingizda, u aslida uyga joylashtiriladi va == bu erda noto'g'ri ma'lumotlar keltiradi. (Soddalashtirilgan)

0
qo'shib qo'ydi