Управление версиями является самым важным инструментом, который программист имеет, еще более важный, чем фактические языки программирования. Неважно, сколько пользователей Вы имеете, управление исходным кодом должно всегда требоваться. Я не знаю, сколько раз я внес повреждающимся изменением и затем должен был возвратиться и работать над старым кодом или по крайней мере просто видеть, как исходный код функционировал. Я работаю в малочисленных командах, и мы используем SVN Notifier для сообщения нам, когда вещи фиксируются. Это позволяет нам рассматривать каждый, другие работают, и Вы не получаете страшное, "Вы регистрировали свой код уже?" вопросы все время. Используя управление исходным кодом с начала уничтожит много головных болей (перезаписи, потерянный код, поединки по тому, кто изменил то, что), что можно столкнуться.
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
.)
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.
В случае, если вам нужно пойти в противоположном направлении, то есть от базового типа к перечислению определенного типа:
enum MyEnumType { a, b, c };
//...
MyEnumType enum_val = (MyEnumType)Enum.ToObject(typeof(MyEnumType), 2);
Console.WriteLine(enum_val == MyEnumType.c);
// "True"
Я счел это необходимым (скорее, чем простое приведение) при создании универсальных типов. Поскольку вы не можете использовать предложения where, чтобы в достаточной степени ограничить общий