Вопрос 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. Как это сделать?
Здравствуйте, 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
Здравствуйте, Vasvasvas2004, Вы писали:
V>V>enum ETest{ One = 1, Two = 2};
V>...
V>ETest oETestSomething = (ETest) 2.2;
V>
V>В данном случае компилятор ругается.
На что же он ругается?
Здравствуйте, 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};
Здравствуйте, 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>>
Здравствуйте, 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>
А можно пояснить?
Здравствуйте, Vasvasvas2004, Вы писали:
V>А можно пояснить?
Что именно непонятно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1469 on Windows 7 6.1.7600.0>>
Здравствуйте, 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){
...
}
Здравствуйте, 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);
}