SORU
24 Mart 2010, ÇARŞAMBA


Herkes C yüzen imzalanan bu tuhaf davranışlarını açıklayabilir#?

İşte yorum: örnek

class Program
{
    // first version of structure
    public struct D1
    {
        public double d;
        public int f;
    }

    // during some changes in code then we got D2 from D1
    // Field f type became double while it was int before
    public struct D2 
    {
        public double d;
        public double f;
    }

    static void Main(string[] args)
    {
        // Scenario with the first version
        D1 a = new D1();
        D1 b = new D1();
        a.f = b.f = 1;
        a.d = 0.0;
        b.d = -0.0;
        bool r1 = a.Equals(b); // gives true, all is ok

        // The same scenario with the new one
        D2 c = new D2();
        D2 d = new D2();
        c.f = d.f = 1;
        c.d = 0.0;
        d.d = -0.0;
        bool r2 = c.Equals(d); // false! this is not the expected result        
    }
}

Sen bu konuda ne düşünüyorsun?

CEVAP
24 Mart 2010, ÇARŞAMBA


Hata System.ValueType aşağıdaki iki satırı şöyledir: (başvuru kaynağı haline bastım)

if (CanCompareBits(this)) 
    return FastEqualsCheck(thisObj, obj);

(Her iki yöntem [MethodImpl(MethodImplOptions.InternalCall)])

Alanların hepsi 8 bayt genişliğinde, CanCompareBits yanlışlıkla doğru verir, ama anlamsal olarak aynı, iki farklı değerler düzeyinde bir karşılaştırma elde edilir.

En az bir alan değil 8 bayt genişliğinde CanCompareBits false değerini döndürür ve kod gelirleri için kullanmak yansıma döngü üzerinde alanları ve Ara Equals her değer, doğru davranır -0.0 eşit 0.0.

Burada SSCLİ CanCompareBits kaynak:

FCIMPL1(FC_BOOL_RET, ValueTypeHelper::CanCompareBits, Object* obj)
{
    WRAPPER_CONTRACT;
    STATIC_CONTRACT_SO_TOLERANT;

    _ASSERTE(obj != NULL);
    MethodTable* mt = obj->GetMethodTable();
    FC_RETURN_BOOL(!mt->ContainsPointers() && !mt->IsNotTightlyPacked());
}
FCIMPLEND

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • girleffect

    girleffect

    20 Mayıs 2008
  • Menglong Tav

    Menglong Tav

    18 Temmuz 2010
  • TechSmartt

    TechSmartt

    29 Aralık 2010