2009-12-06 17 views
6

Enum alan bir işlev yazıyor ve uint'a atıyor. int'a gönderirken gördüğüm kadarıyla, önce bir nesneye göndermeniz gerekir: (int) (object) myEnumValue. (int) myEnumValue yazarsanız bir derleme süresi istisnası alırsınız.Döküm Enum to uint

Şimdi, uyandırmaya çalıştığımda, (uint) (object) myEnumValue'un iyi olacağını tahmin ediyordum. Güzelce derler, ancak çalıştırıldığında, bir InvalidCastException üretir. Bu yüzden işe gitmek için, ben de en komik görünüyor düşünüyorum, bu yüzden oldukça mutluyum ama neden böyledir

(uint) (int) (object) myEnumValue 

kullandım?

Belki de uint için object döküm mümkün değildir neden sormak daha doğru olurdu, ancak bir Enum uint ila gitmek için başka bir yol olup olmadığını ilgileniyorum. Var mı?

Düzenleme:

bağlam bir işlev, böyle bir şey olur:

public static uint ToUInt (Enum e) 
{ 
    return (uint) (int) (object) e; 
} 

Düzenleme 2:

iyi çözüm thecoop bahsettiği gibi:

Convert.ToUInt32(e) 

cevap

13

(uint) (object) myEnum yaklaşımı, varsayılan olarak, C# enum'ların temel türü olarak int kullanıyor ve bir int kutulu olduğunda dönüştükleri şeydir. C# sözdizimi, enum gibi görünen türlerinden (enum MyEnum : uint gibi) görünmesini sağlar.

Sen objectint ilk, ardından int den uint sayısal bir dönüşüm yapmak den açıkça Unbox derleyici söylemek gerekir. (Sözdizimi aynı olsa da, bir değer türüne object den unboxing int ve uint arasında döküm farklı bir süreçtir.)

Ben int yayın yaparken gördüklerime
+0

Tamam, Enum'umu Enum: uint olarak belirtirsem, başka bir yol olurdu? –

+0

@Jonatan: evet, bu enum'u uint olarak kutlayacak ve unbox'ı uint olarak zorlayacaksınız. –

+0

Bu doğru: (uint) e iyi olacak, ama (int) e patlayacak. –

5

, bunu döküm zorunda ilk önce bir nesneye: (int) (object) myEnum. (int) myEnum yazıyorsanız, derleme süresi istisnası alırsınız.

Doğru değil. Bir enum değerini doğrudan bir tamsayı türüne atayabilirsiniz.

Şimdi, uyandırmaya çalıştığımda, (uint) (object) myEnum'un iyi olacağını umuyorum. Güzelce derler, ancak çalıştırıldığında InvalidCastException oluşturur. Bu yüzden işe almak için kullanıyorum: (uint) (int) (object) myEnum
Bence komik görünüyor, bu yüzden çok mutluyum, ama neden böyle? Eğer object bir enum değer dağıtmak

, varsayılan olarak int olduğunu onun yatan tip olarak kutulu olacak.Kutulu bir değeri doğrudan gerçek türünden başka herhangi bir türe alamazsınız. Hatta bu başarısız olur:

short s = 10; 
object o = s; 
int i = (int)o; // throws `InvalidCastException` while `int i = (int)s;` works. 
0

Eğer ters yönde gitmeye gerek, yani altta yatan türünden bir türdeki numaralandırma için:

enum MyEnumType { a, b, c }; 
//... 
MyEnumType enum_val = (MyEnumType)Enum.ToObject(typeof(MyEnumType), 2); 
Console.WriteLine(enum_val == MyEnumType.c); 
// "True" 

Bunu bulunmuştur jenerik türleri yazarken gerekli (basit döküm yerine). Sayım türünüze jenerik <T>'u yeterince kısıtlamak için 'nerede' cümlelerini kullanamayacağınız için derleyici, bir sayı yazmanıza izin vermez.