Приведение к недопустимому значению перечисления, Enum.ToObject, не генерирует исключение, устанавливает для Enum значение int

Это нормальное поведение?

Написание кастинга enum для

1) Попробуйте синтаксический анализ текста 2) Откат к синтаксическому анализу int.

разбор int никогда не выдает ошибку...

Попробуйте запустить следующий скрипт в LinqPad, я не тестировал другие компиляторы, кроме linqpad, но сомневаюсь, что это проблема Linqpad.

Как я могу выдать ошибку, если совпадение int не удается?

void Main()
{
    FieldAttributes fieldattributeenum = FieldAttributes.Assembly;
    B b = B.Valx1;      
    b.Dump("B = "+((int)b).ToString()); //Valx1 (11);

    fieldattributeenum.Dump("fieldattributeenum = " +((int)fieldattributeenum).ToString()); //Assembly (3)

    b = (B) Enum.ToObject(typeof(B), (int) fieldattributeenum); 
    b.Dump("B = "+((int)b).ToString()); //valcorrect3 (3)
    A a = (A) Enum.ToObject(typeof(A), (int) fieldattributeenum); //
    a.Dump("A = "+ ((int)a).ToString()); // ??? (3) 
}

public enum B{  
    Valx1=11,
    Valx2=12,
    Valx3=13,
    Valx4=14,
    valcorrect3 = 3
}
public enum A{  
    Valx1=11,
    Valx2=12,
    Valx3=13,
    Valx4=14,
    valcorrect3
}

person hreinn1000    schedule 09.12.2014    source источник


Ответы (2)


Просто используйте Enum.IsDefined. По сути, перечисления - это просто целые числа, и вы можете назначить любое целое число перечислению, даже если оно не определено.

if(!Enum.IsDefined(typeof(A), a))
{
    throw new InvalidCastException("Not a valid value for A: " + a);
}
person juharr    schedule 09.12.2014
comment
Спасибо, думаю, у меня должен быть RTFM :) - person hreinn1000; 10.12.2014