Прехвърлянето към невалидна стойност на enum, 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. По принцип enums са просто int и можете да присвоите всяко int към enum, дори ако не е дефинирано.

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

От MSDN Метод Enum.ToObject (Тип, Int32)

Методът ToObject(Type, Int32) преобразува стойност в член на изброяване, чиято основна стойност е стойност. Имайте предвид, че преобразуването е успешно дори ако стойността е извън границите на членовете на enumType. За да сте сигурни, че стойността е валидна основна стойност на изброяването enumType, предайте я на метода IsDefined.

Така е по замисъл.

person Hamlet Hakobyan    schedule 09.12.2014