2010-08-30 12 views
7

ben bilinen bir object o bir int veya uint kutulu olmak zorunda:Unboxing uint/int

object o = int.MinValue 
object o = (uint)int.MinValue // same bytes as above 

Ben kutuda ne olduğunu bilmiyorum, umurumda olan tek şey Orada int veya uint veya uint için zorlamak istediğiniz 4 bayt vardır. Bu benim (yerine kutuları) değerlerine sahip bir unchecked bağlamda çalışıyor:

unchecked 
{ 
    int a = (int)0x80000000u; // will be int.MinValue, the literal is a uint 
    uint b = (uint)int.MinValue; 
} 

Not: C# varsayılan her şey işaretli olmadığı derken değişmezleri ve derleyici ile ilgileniyor çünkü kontrolsüz bağlam burada gereklidir Kendimizi yürüyerek vurup vurmayacağımızı bilmek istiyor.

sorunu (bu 4 bayt olduğunu yanı sıra) Ben neyin kutunun içini bilmiyorum artık, ama ben bir InvalidCastException olsun yanlış tipine Unbox çalıştığınızda çalışma zamanı yapar. Bunun makul bir çalışma zamanı davranışı olduğunu biliyorum, ancak bu durumda ne yaptığımı biliyorum ve "denetlenmemiş bir kutuyu" istiyorum. Böyle bir şey var mı?

Biliyorum catch ve yeniden deneyin, yanıt olarak sayılmaz.

cevap

4

Convert.ToInt32, herhangi bir nesneyi mümkünse bir int dönüştürebilir, ayrıca dönüştürme veya ayrıştırma yapsa da, istediğinizden daha yavaş olabilir.

bunun bir int veya uint olduğunu biliyorsanız

, bunu yapabilirdi:

int x = (o is int) ? (int)o : (int)(uint)o; 
+0

dönüştürme taşma istisnalar yükseltir (ı kontrolsüz zorlama gerekir). Kutu içeriğinin kontrol edilmesi iyi bir fikir olsa da, daha iyi bir çözüm bulunmasını umuyor. –

+0

@Johannes: Eğer 64 bitlik tamsayılar üzerinde çalışmaya ihtiyacınız varsa, daha büyük bir boyuta çevirerek istisnai durumdan kurtulmak için 'unchecked ((uint) Convert.ToInt64 (o))' yapamazsınız Bunu yapmak için daha büyük bir boyut. – Quartermeister