элементтер объектіге жіберілсе, неге бірдей жұмыс істемейді?

Мен инт мен қарсыласып, оларды салыстыра отырып, оларды салыстыра отырып, теңдік әрқашан жалған болады. Неліктен?

        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("----------------");

Жаңарту: бұл бірдей түрге жатпайды

        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 жауаптар

float басқа float мәніне тең және int басқа int мәніне тең. true қайтаратын жалғыз жолдар мыналар:

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

Екі жағдайда да i мәнін float дегенге жабық түрлендіру бар, олар келесіге тең:

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

Бұл түрленулер әдістер мен операторлардың шамадан тыс жүктелуіне қажетті қалыпты қайта өңдеу болып табылады.

Қалған бөліктердің ешқайсысы бұл жабық түрлендіруді қамтиды, сондықтан олар мәнімен салыстыру кезінде false нәтижесін беретін екі түрлі түрді салыстырады бұл барлық Equals қоңырауларына ұқсас). Сондықтан true true true кодының Equals кодын пайдалану арқылы бірдей түрдегі екі мәнді салыстыру , мәні бойынша .

Бұл жағдайда:

Console.WriteLine(obi == obf);

сандық мәндерді салыстыруға тырыспайды - ол қораптағы нысандар үшін сілтемелерін салыстырады. Екі түрлі сілтеме болғандықтан, нәтиже false - және екі мән де int түрінде болған жағдайда да болады.

10
қосылды
@CharlesLambert: Ия. IL-ге көз жүгіртіңіз және оны орындауды көресіз.
қосылды автор Jon Skeet, көзі
жасырын түрлендіру компиляция уақытында өңделе ме?
қосылды автор Charles Lambert, көзі

Өзгелері бұрынғыдай == сіздің нысандарыңызда күткендей жұмыс істемейтінін түсіндірді.

oi2 - Equals - бұл виртуалды функция және Int32.Equals (object) деп аталады,

true , егер obj - Int32 данасы болса және осы дананың мәніне тең болса; әйтпесе, жалған .

Бұл сондай-ақ obi.Equals (obf)) қайтаратындығын түсіндіреді: obf Int32 данасы емес.

3
қосылды

Сіз интерфейсті боксқа айналдырасыз және нысанға өзгермелі, яғни олар сілтемелер ретінде салыстырылады. Олар сол нысанға сілтеме бермегендіктен, олар тең емес.

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

1
қосылды

Сіз екі нысанды жариялаған кезде олар басқа жад орналасуына сілтеме жасайды:

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

бірақ келесі әрекетті байқап көріңіз: біреуі басқа біреуге сілтеме жасай берсін:

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

MSDN, Object.Equals Method

Теңгерімнің теңшелімінің орындалуы сілтеме теңдігін қолдайды   анықтамалық типтері және құн түрлеріне арналған битовый теңдік. Анықтама   теңдік дегеніміз, салыстырылатын объектілік сілтемелерді білдіреді   сол объект. Битпитальдық теңдік дегеніміз, салыстыру нысандары бар   екілік көрініс.

1
қосылды

Қораптың құндылық түрлеріне байланысты не болатынын білу үшін, Shivprasad бұл жерде қысқаша сипаттайды:

Бокс және қораптан шығару

Массивтерді нысандарға бүркемелегендіктен, сіз енді сілтеме теңдігін орындайсыз. Енді сіздің мысалыңыздағы әртүрлі жад орындарында болғандықтан, олар жалған болады.

1
қосылды

Equals нысан сілтемесінің мекенжайын салыстырады және екі сан әртүрлі орындарда сақталады. егер екі мән түрін салыстырсаңыз, Тең беті float, int, string және басқа түрлер үшін алдын ала анықталғандықтан, дұрыс әрекет етеді.

0
қосылды

Өйткені олар әртүрлі мемуарлы жасушаларға тағайындалады. 2 нысан: = бір ғана объект болған кезде ғана. Float және int бөлімдерінде сіз айнымалы мәндерді тексерген кезде шындықты аласыз, себебі олардың орындалу уақыты олардың мәнін тексереді. бар болғаны!

0
қосылды

Мән түрін нысанға шығарғанда, ол шын мәнінде үймеге қойылады және == дәл сол нүктеде сілтемелерді салыстырады, бұл жалған болады. (Жеңілдетілген)

0
қосылды