SORU
6 Temmuz 2009, PAZARTESİ


Neden'bir ondalık olarak bir int İ ciltsiz t?

Aşağıdaki gibi bir ondalık alıyordum o IDataRecord reader var

decimal d = (decimal)reader[0];

Nedense bu geçersiz dökme bir istisna atama geçerli değil. "" Belirtilen söyleyerek atar

reader[0].GetType() ben ne zaman bir Int32 olduğunu söylüyor. Bildiğim kadarıyla, bu bir sorun olmamalı....

Gayet iyi çalışan bu bu parçacığı tarafından test ettik.

int i = 3750;
decimal d = (decimal)i;

Bu kafamı int ondalık kesir olarak okuyucu içerdiği kaldırmak için başarısız neden merak tırmalama beni terk etti.

Herkes bu olayın sebebini biliyor mu? Ben bir şey eksik ince var mı?

CEVAP
6 Temmuz 2009, PAZARTESİ


Sadece bir değer orijinal türü (ve bu tür null sürüm) türü ciltsiz edebilirsiniz.

Bu arada, bu geçerli değil (iki satır sürümü için sadece bir steno):

object i = 4;
decimal d = (decimal)(int)i; // works even w/o decimal as it's a widening conversion

Bunun arkasındaki nedeni Eric Lippert's blog entry: Representation and Identity bunu okuyun

Şahsen, operasyonun dört farklı türleri (hepsi farklı IL talimatları) içine şeyler dökme sözdizimi ile yaptığım sınıflandırır:

  1. Boks (box IL talimat) ve kutulama (unbox IL talimat)
  2. İnhertiance hiyerarşisi (C dynamic_cast<Type> gibi, castclass IL talimat doğrulamak için kullanır) ile döküm
  3. İlkel türler (C static_cast<Type> gibi , ilkel türleri arasında atmalarını farklı türleri için IL talimatları var) arasında döküm
  4. Arayan kullanıcı dönüşüm operatörleri (İL düzeyinde sadece op_XXX uygun yöntemi için yöntem çağrıları) tanımlanmış.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • John Lynn

    John Lynn

    8 Ocak 2010
  • TechnoBuffalo

    TechnoBuffal

    8 HAZİRAN 2007
  • Truc Minh

    Truc Minh

    23 Ocak 2011