преобразование int -> enum
От: Vasvasvas2004  
Дата: 12.04.10 19:39
Оценка:
Вопрос 1.
enum ETest{ One = 1, Two = 2};
...

ETest oETestOne = (ETest) 1;
ETest oETestTwo = (ETest) 2;
ETest oETestSomething = (ETest) 3;


Компилируется. Программа проходит все 3 строчки без проблем. Дебаггер показывает

oETestOne = "One"
oETestTwo = "Two"
oETestSomething ="3"

Хотелось бы получить Exception с "3".

Вопрос 2.
enum ETest{ One = 1, Two = 2};
...

ETest oETestSomething = (ETest) 2.2;

В данном случае компилятор ругается.
Но вот читаю стандарт вот отсюда http://www.ecma-international.org/publications/standards/Ecma-334.htm

============
8.11 Enums
...
The use of enums is superior to the use of integer constants
...
============
Компилятор кажется ругается по делу!

============
13.2.2 Explicit enumeration conversions
The explicit enumeration conversions are:
• From sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, or decimal to
any enum-type.
• From any enum-type to sbyte, byte, short, ushort, int, uint, long, ulong, char, float,
double, or decimal.
• From any enum-type to any other enum-type.
An explicit enumeration conversion between two types is processed by treating any participating enum-type
as the underlying type of that enum-type, and then performing an implicit or explicit numeric conversion
between the resulting types. [Example: Given an enum-type E with and underlying type of int, a conversion
from E to byte is processed as an explicit numeric conversion (§13.2.1) from int to byte, and a
conversion from byte to E is processed as an implicit numeric conversion (§13.1.2) from byte to int. end
example]
===========

А что!!! А вроде легко должен преобразовывать! Надо только поменять underlying type. Как это сделать?
Re: преобразование int -> enum
От: vmpire Россия  
Дата: 12.04.10 19:53
Оценка:
Здравствуйте, Vasvasvas2004, Вы писали:

V>Вопрос 1.

V>
V>enum ETest{ One = 1, Two = 2};
V>...

V>ETest oETestOne = (ETest) 1;
V>ETest oETestTwo = (ETest) 2;
V>ETest oETestSomething = (ETest) 3;
V>


V>Компилируется. Программа проходит все 3 строчки без проблем. Дебаггер показывает


V>oETestOne = "One"

V>oETestTwo = "Two"
V>oETestSomething ="3"

V>Хотелось бы получить Exception с "3".

А где вопрос-то, собственно?
Есди вопрос "почему?" — то да, это нормальное поведение компилятора. Хотите Exception — проверяйте вручную на допустимость значения.

V>Вопрос 2.

V>
V>enum ETest{ One = 1, Two = 2};
V>...

V>ETest oETestSomething = (ETest) 2.2;
V>

V>В данном случае компилятор ругается.
V>Но вот читаю стандарт вот отсюда http://www.ecma-international.org/publications/standards/Ecma-334.htm

V>============

V>8.11 Enums
V>...
V>The use of enums is superior to the use of integer constants
V>...
V>============
V>Компилятор кажется ругается по делу!

V>============

V>13.2.2 Explicit enumeration conversions
V>The explicit enumeration conversions are:
V>• From sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, or decimal to
V>any enum-type.
V>• From any enum-type to sbyte, byte, short, ushort, int, uint, long, ulong, char, float,
V>double, or decimal.
V>• From any enum-type to any other enum-type.
V>An explicit enumeration conversion between two types is processed by treating any participating enum-type
V>as the underlying type of that enum-type, and then performing an implicit or explicit numeric conversion
V>between the resulting types. [Example: Given an enum-type E with and underlying type of int, a conversion
V>from E to byte is processed as an explicit numeric conversion (§13.2.1) from int to byte, and a
V>conversion from byte to E is processed as an implicit numeric conversion (§13.1.2) from byte to int. end
V>example]
V>===========

V>А что!!! А вроде легко должен преобразовывать!

Не должен. В списке нет конверсии из double в Enum.

V>Надо только поменять underlying type. Как это сделать?

Поменять нельзя. Можно явно указать при объявлении enum
Re: преобразование int -> enum
От: nikov США http://www.linkedin.com/in/nikov
Дата: 12.04.10 19:54
Оценка:
Здравствуйте, Vasvasvas2004, Вы писали:

V>
V>enum ETest{ One = 1, Two = 2};
V>...

V>ETest oETestSomething = (ETest) 2.2;
V>

V>В данном случае компилятор ругается.

На что же он ругается?
Re[2]: преобразование int -> enum
От: Vasvasvas2004  
Дата: 12.04.10 22:04
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, Vasvasvas2004, Вы писали:


V>>
V>>enum ETest{ One = 1, Two = 2};
V>>...

V>>ETest oETestSomething = (ETest) 2.2;
V>>

V>>В данном случае компилятор ругается.

N>На что же он ругается?



ошибся ...
enum ETest{ One = 1, Two = 2.2};
Re: преобразование int -> enum
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.04.10 06:38
Оценка:
Здравствуйте, Vasvasvas2004, Вы писали:

V>Хотелось бы получить Exception с "3".


class ETest
{
    private Etest() {}
    
    public static readonly One = new ETest();
    public static readonly Two = new ETest();
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1469 on Windows 7 6.1.7600.0>>
AVK Blog
Re[2]: преобразование int -> enum
От: Vasvasvas2004  
Дата: 13.04.10 16:25
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Vasvasvas2004, Вы писали:


V>>Хотелось бы получить Exception с "3".


AVK>
AVK>class ETest
AVK>{
AVK>    private Etest() {}
    
AVK>    public static readonly One = new ETest();
AVK>    public static readonly Two = new ETest();
AVK>}
AVK>


А можно пояснить?
Re[3]: преобразование int -> enum
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.04.10 16:38
Оценка:
Здравствуйте, Vasvasvas2004, Вы писали:

V>А можно пояснить?


Что именно непонятно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1469 on Windows 7 6.1.7600.0>>
AVK Blog
Re: преобразование int -> enum
От: Vasvasvas2004  
Дата: 16.06.10 22:18
Оценка:
Здравствуйте, Vasvasvas2004, Вы писали:

V>Вопрос 1.

V>
V>enum ETest{ One = 1, Two = 2};
V>...

V>ETest oETestOne = (ETest) 1;
V>ETest oETestTwo = (ETest) 2;
V>ETest oETestSomething = (ETest) 3;
V>


V>Компилируется. Программа проходит все 3 строчки без проблем. Дебаггер показывает


V>oETestOne = "One"

V>oETestTwo = "Two"
V>oETestSomething ="3"

V>Хотелось бы получить Exception с "3".



Enum.IsDefined() легко проверяет и при желании можно сгенерить Exception или использовать вот так
enum ETest{ One = 1, Two = 2, OutOfRange = 3};
...
ETest oETest = Enum.IsDefined(typeof(ETest), 70) ? (ETest) 70 : ETest.OutOfRange;


но вот никак не могу сообразить как бы это затащить в отдельную функцию типа
object oFValueToEnum( Type oType, int iValue){
...
}
Re[2]: преобразование int -> enum
От: Vasvasvas2004  
Дата: 16.06.10 22:31
Оценка:
Здравствуйте, Vasvasvas2004, Вы писали:

V>Здравствуйте, Vasvasvas2004, Вы писали:


V>>Вопрос 1.

V>>
V>>enum ETest{ One = 1, Two = 2};
V>>...

V>>ETest oETestOne = (ETest) 1;
V>>ETest oETestTwo = (ETest) 2;
V>>ETest oETestSomething = (ETest) 3;
V>>


V>>Компилируется. Программа проходит все 3 строчки без проблем. Дебаггер показывает


V>>oETestOne = "One"

V>>oETestTwo = "Two"
V>>oETestSomething ="3"

V>>Хотелось бы получить Exception с "3".



V>Enum.IsDefined() легко проверяет и при желании можно сгенерить Exception или использовать вот так

V>
V>enum ETest{ One = 1, Two = 2, OutOfRange = 3};
V>...
V>ETest oETest = Enum.IsDefined(typeof(ETest), 70) ? (ETest) 70 : ETest.OutOfRange;
V>


V>но вот никак не могу сообразить как бы это затащить в отдельную функцию типа

V>
V>object oFValueToEnum( Type oType, int iValue){
V>...
V>}
V>



тупил ... пока не написал вопрос
static public object EFValueToEnum( Type oType, int iValue)
{
        string str = Enum.GetName(oType, iValue);
        if (str == null)
        {
            return oType.GetField(StrOutOfRange).GetValue(StrOutOfRange);
        }
        return Enum.ToObject(oType, iValue);
}
Re[2]: преобразование int -> enum
От: _FRED_ Черногория
Дата: 17.06.10 04:04
Оценка:
Здравствуйте, Vasvasvas2004, Вы писали:

V>>Компилируется. Программа проходит все 3 строчки без проблем. Дебаггер показывает


V>>Хотелось бы получить Exception с "3".

V>Enum.IsDefined() легко проверяет и при желании можно сгенерить Exception или использовать вот так


Совсем не легко, так же как и ниже с подключением рефлекшена и проверкой имени. Полезнее было бы написать: чего требуется (для каких целей проверки нужны), может что-нибудь действительно полезное получилось бы.
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.