C # всегда допускал неявное преобразование литерала 0 в любое значение Enum. Изменилось то, как правило применяется к другим константным выражениям. Это было сделано, чтобы быть более последовательным и позволять любым константным выражениям, которые оцениваются в 0, быть неявно конвертируемыми в перечисление.
Приведенный вами пример демонстрирует одинаковое поведение во всех версиях C #.
Вот пример измененного поведения (непосредственно из связанной документации )
public enum E
{
Zero = 0,
One = 1,
}
class A
{
public static A(string s, object o)
{ System.Console.WriteLine("{0} => A(object)", s); }
public static A(string s, E e)
{ System.Console.WriteLine("{0} => A(Enum E)", s); }
static void Main()
{
A a1 = new A("0", 0);
A a3 = new A("(int) E.Zero", (int) E.Zero);
}
}
Вывод Visual C # 2005:
0 => A(Enum E)
(int) E.Zero => A(object)
Вывод Visual C # 2008:
0 => A(Enum E)
(int) E.Zero => A(Enum E)