Кастинг Перечисления к uint

Управление версиями является самым важным инструментом, который программист имеет, еще более важный, чем фактические языки программирования. Неважно, сколько пользователей Вы имеете, управление исходным кодом должно всегда требоваться. Я не знаю, сколько раз я внес повреждающимся изменением и затем должен был возвратиться и работать над старым кодом или по крайней мере просто видеть, как исходный код функционировал. Я работаю в малочисленных командах, и мы используем SVN Notifier для сообщения нам, когда вещи фиксируются. Это позволяет нам рассматривать каждый, другие работают, и Вы не получаете страшное, "Вы регистрировали свой код уже?" вопросы все время. Используя управление исходным кодом с начала уничтожит много головных болей (перезаписи, потерянный код, поединки по тому, кто изменил то, что), что можно столкнуться.

7
задан Jonatan Lindén 11 December 2009 в 17:48
поделиться

3 ответа

The (uint) (object) myEnum approach fails because, by default, C# enums use int as their underlying type, and an int is what they get turned into when they're boxed. The C# syntax makes it look like enums inherit from their underlying type (like enum MyEnum : uint).

You have to explicitly tell the compiler to unbox from object to int first, then do a numerical conversion from int to uint. (Even though the syntax is the same, unboxing from object to a value type is a different process from casting between int and uint.)

14
ответ дан 6 December 2019 в 10:00
поделиться

From what I've seen when casting to int, you have to cast it to an object first: (int) (object) myEnum. If you write (int) myEnum you get a compile time exception.

Not true. You can directly cast an enum value to an integer type.

Now, when I tried to cast it to uint, I was expecting that (uint) (object) myEnum would be alright. It compiles nicely, but when run, it generates an InvalidCastException. So to get it to work, I've used: (uint) (int) (object) myEnum
I think it looks funny, so I'm quite happy, but why is it so?

When you cast an enum value to object, it'll be boxed as its underlying type, which is int by default. You cannot unbox a boxed value to any type other than its actual type directly. Even this will fail:

short s = 10;
object o = s;
int i = (int)o; // throws `InvalidCastException` while `int i = (int)s;` works.
5
ответ дан 6 December 2019 в 10:00
поделиться

В случае, если вам нужно пойти в противоположном направлении, то есть от базового типа к перечислению определенного типа:

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

Я счел это необходимым (скорее, чем простое приведение) при создании универсальных типов. Поскольку вы не можете использовать предложения where, чтобы в достаточной степени ограничить общий вашим типом перечисления, компилятор не позволит вам привести к нему числовое значение.

0
ответ дан 6 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: