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
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:
- Boks (
box
IL talimat) ve kutulama (unbox
IL talimat) - Ä°nhertiance hiyerarÅŸisi (C
dynamic_cast<Type>
gibi,castclass
IL talimat doğrulamak için kullanır) ile döküm - İ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 - 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ış.
Neden't ondalık sayılar ikili düz...
Neden &; ad std quot;" kötü olara...
Neden C ön işlemci word "linux&qu...
Neden benim program tam olarak 8192 el...
Neden git ileri varsayılan olarak birl...