Зависит ли порядок выполнения от версий фреймворка или C#?
От: Passerby  
Дата: 29.07.19 16:15
Оценка:
В программе 2 enum, которые хотелось бы использовать в обобщенной функции следующим образом.
foreach (var en in Enum.GetValues(typeof(T)))//T - один из двух enum.

Но так возможно только если порядок вывода в foreach тот же, что и в enum. Должен ли объект получаемый typeof(T), иметь один и тот же порядок, независимый от версии фреймворка, C#, компилятора или ничего в спецификации об этом не сказано?
Отредактировано 29.07.2019 16:23 Passerby . Предыдущая версия .
Re: Зависит ли порядок выполнения от версий фреймворка или C#?
От: Danchik Украина  
Дата: 29.07.19 16:28
Оценка: 1 (1)
Здравствуйте, Passerby, Вы писали:

P>В программе 2 enum, которые хотелось бы использовать в обобщенной функции следующим образом.

P>foreach (var en in Enum.GetValues(typeof(T)))//T — один из двух enum.
P>Но так возможно только если порядок вывода в foreach тот же, что и в enum. Должен ли объект получаемый typeof(T), иметь один и тот же порядок, независимый от версии фреймворка, C#, компилятора или ничего в спецификации об этом не сказано?

У вас с этим проблемы? Порядок меняться не должен иначе все к чертям полетит.
И компилятор тут только сбоку. RTFM https://docs.microsoft.com/ru-ru/dotnet/api/system.enum.getvalues?view=netframework-4.8

И да, не важно сколько у вас этих enum, вообще.
Re[2]: Зависит ли порядок выполнения от версий фреймворка или C#?
От: Passerby  
Дата: 29.07.19 17:09
Оценка:
Здравствуйте, Danchik, Вы писали:

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


P>>В программе 2 enum, которые хотелось бы использовать в обобщенной функции следующим образом.

P>>foreach (var en in Enum.GetValues(typeof(T)))//T — один из двух enum.
P>>Но так возможно только если порядок вывода в foreach тот же, что и в enum. Должен ли объект получаемый typeof(T), иметь один и тот же порядок, независимый от версии фреймворка, C#, компилятора или ничего в спецификации об этом не сказано?

D>У вас с этим проблемы? Порядок меняться не должен иначе все к чертям полетит.

D>И компилятор тут только сбоку. RTFM https://docs.microsoft.com/ru-ru/dotnet/api/system.enum.getvalues?view=netframework-4.8

D>И да, не важно сколько у вас этих enum, вообще.

Увы, в примере по вашей ссылке показано, что порядок вывода элементов не совпадает с порядком их в enum. Либо ошибка в примере, либо сознательно показывается необязательность сохранения порядка.
Re[3]: Зависит ли порядок выполнения от версий фреймворка или C#?
От: Danchik Украина  
Дата: 29.07.19 17:18
Оценка:
Здравствуйте, Passerby, Вы писали:

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


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


P>>>В программе 2 enum, которые хотелось бы использовать в обобщенной функции следующим образом.

P>>>foreach (var en in Enum.GetValues(typeof(T)))//T — один из двух enum.
P>>>Но так возможно только если порядок вывода в foreach тот же, что и в enum. Должен ли объект получаемый typeof(T), иметь один и тот же порядок, независимый от версии фреймворка, C#, компилятора или ничего в спецификации об этом не сказано?

D>>У вас с этим проблемы? Порядок меняться не должен иначе все к чертям полетит.

D>>И компилятор тут только сбоку. RTFM https://docs.microsoft.com/ru-ru/dotnet/api/system.enum.getvalues?view=netframework-4.8

D>>И да, не важно сколько у вас этих enum, вообще.

P>Увы, в примере по вашей ссылке показано, что порядок вывода элементов не совпадает с порядком их в enum. Либо ошибка в примере, либо сознательно показывается необязательность сохранения порядка.

Чтобы я не перчитывал наново для тебя документацию покажи свои энумы. Документация четко говорит об энумах с константными значениями, там они сортируют, как читай. Остальное как эти константы выводит компилятор: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/enum
Re[4]: Зависит ли порядок выполнения от версий фреймворка и
От: Passerby  
Дата: 29.07.19 17:39
Оценка:
Здравствуйте, Danchik, Вы писали:

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


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


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


P>>>>В программе 2 enum, которые хотелось бы использовать в обобщенной функции следующим образом.

P>>>>foreach (var en in Enum.GetValues(typeof(T)))//T — один из двух enum.
P>>>>Но так возможно только если порядок вывода в foreach тот же, что и в enum. Должен ли объект получаемый typeof(T), иметь один и тот же порядок, независимый от версии фреймворка, C#, компилятора или ничего в спецификации об этом не сказано?

D>>>У вас с этим проблемы? Порядок меняться не должен иначе все к чертям полетит.

D>>>И компилятор тут только сбоку. RTFM https://docs.microsoft.com/ru-ru/dotnet/api/system.enum.getvalues?view=netframework-4.8

D>>>И да, не важно сколько у вас этих enum, вообще.

P>>Увы, в примере по вашей ссылке показано, что порядок вывода элементов не совпадает с порядком их в enum. Либо ошибка в примере, либо сознательно показывается необязательность сохранения порядка.

D>Чтобы я не перчитывал наново для тебя документацию покажи свои энумы. Документация четко говорит об энумах с константными значениями, там они сортируют, как читай. Остальное как эти константы выводит компилятор: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/enum

1. Это не относится к порядку членов в Type.
2. И порядок в самом enum определен? Есть спецификация, указывающая на то, что enum En{a,c,b} не будет преобразован в enum En{a=0,b=3,c=2}?

Уже не актуально. Немного изменил код.
Отредактировано 29.07.2019 23:35 Passerby . Предыдущая версия . Еще …
Отредактировано 29.07.2019 22:52 Passerby . Предыдущая версия .
Re[3]: Зависит ли порядок выполнения от версий фреймворка или C#?
От: Sinclair Россия https://github.com/evilguest/
Дата: 30.07.19 06:10
Оценка: 2 (1)
Здравствуйте, Passerby, Вы писали:
D>>И да, не важно сколько у вас этих enum, вообще.
P>Увы, в примере по вашей ссылке показано, что порядок вывода элементов не совпадает с порядком их в enum. Либо ошибка в примере, либо сознательно показывается необязательность сохранения порядка.
В общем случае порядок объявления членов перечисления восстановить невозможно.
Непонятно, зачем он вам нужен. Надёжнее — сортировать в порядке возрастания значений членов.

В простом случае (объявление enum без явного присвоения значений) вы как раз получите сортировку в порядке объявления.
То, что автоматически присовенные значения возрастают в порядке объявления, гарантируется спецификацией (первый член инициализируется в 0, последующие — инкрементально, если мы не говорим о [Flags]).
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Зависит ли порядок выполнения от версий фреймворка или C#?
От: Passerby  
Дата: 30.07.19 13:18
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

D>>>И да, не важно сколько у вас этих enum, вообще.
P>>Увы, в примере по вашей ссылке показано, что порядок вывода элементов не совпадает с порядком их в enum. Либо ошибка в примере, либо сознательно показывается необязательность сохранения порядка.
S>В общем случае порядок объявления членов перечисления восстановить невозможно.
S>Непонятно, зачем он вам нужен. Надёжнее — сортировать в порядке возрастания значений членов.

S>В простом случае (объявление enum без явного присвоения значений) вы как раз получите сортировку в порядке объявления.

S>То, что автоматически присовенные значения возрастают в порядке объявления, гарантируется спецификацией (первый член инициализируется в 0, последующие — инкрементально, если мы не говорим о [Flags]).
Речь шла не о том в каком порядке возрастают члены, а сохраняется ли их порядок объявления (при сохранении значений). Пример привел.
И о том, есть ли спецификация на порядок членов в Type, образованных typeOf.
Re[5]: Зависит ли порядок выполнения от версий фреймворка или C#?
От: Mystic Artifact  
Дата: 30.07.19 13:32
Оценка: 3 (1)
Здравствуйте, Passerby, Вы писали:

P>Речь шла не о том в каком порядке возрастают члены, а сохраняется ли их порядок объявления (при сохранении значений). Пример привел.

P>И о том, есть ли спецификация на порядок членов в Type, образованных typeOf.
Type::GetMembers

The GetMembers method does not return members in a particular order, such as alphabetical or declaration order. Your code must not depend on the order in which members are returned, because that order varies.

На это есть около 3-х причин:
1. Компилятор неограничен в выборе порядка деклараций: иногда этот порядок даже не задан явно в исходном коде (например, для partial классов). Фактически он как бы задан, но средства разработки не акцентируют на этом внимания. А то и вовсе сейчас хипстеры стали использовать по умолчанию маски для получения списка файлов которые съест компилятор (а значит порядок зависит от FS).
2. Рантайм так же не ограничен
3. Единого порядка деклараций, с учётом наследования, не существует, простите за тавтологию лишенную смысла. Но API позволяет получить доступ к членам типа одним махом. Соответственно тут будет деталь реализации.

Ну и наконец — практической пользы от этого есть не очень часто, а там где это действительно важно — вставляют специальные аттрибуты типа Index/Order и по ним сортируют.
Re[5]: Зависит ли порядок выполнения от версий фреймворка или C#?
От: Sinclair Россия https://github.com/evilguest/
Дата: 30.07.19 16:11
Оценка:
Здравствуйте, Passerby, Вы писали:

P>Речь шла не о том в каком порядке возрастают члены, а сохраняется ли их порядок объявления (при сохранении значений). Пример привел.

О каком примере идёт речь?
Об этом:
foreach (var en in Enum.GetValues(typeof(T)))

Или об этом:

enum En{a,c,b} не будет преобразован в enum En{a=0,b=3,c=2}

?
Поведение первого случая полностью описано в документации — порядок GetValues определяется значениями.
Поэтому для обоих енумов во втором примере en будет принимать значения En.a, En.c, En.b.

Про второй пример есть два аспекта:
1. То, что енум слева никогда не станет енумом справа, гарантируется спецификацией языка. а получит значение 0, с получит значение 1, b получит значение 2.
2. А вот отличить енум слева от вот такого, в платформе невозможно: enum En{a=0,b=2,c=1}

P>И о том, есть ли спецификация на порядок членов в Type, образованных typeOf.

Есть. Как уже ответили рядом, спецификация явно запрещает полагаться на порядок членов в Type. Не гарантируется его стабильность даже при последовательных вызовах GetMembers() в рамках одного запуска.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: Зависит ли порядок выполнения от версий фреймворка или C#?
От: Passerby  
Дата: 30.07.19 17:46
Оценка:
Здравствуйте, Sinclair, Вы писали:

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


P>>Речь шла не о том в каком порядке возрастают члены, а сохраняется ли их порядок объявления (при сохранении значений). Пример привел.

S>О каком примере идёт речь?
S>Об этом:
S>
S>foreach (var en in Enum.GetValues(typeof(T)))
S>

S>Или об этом:
S>

S>enum En{a,c,b} не будет преобразован в enum En{a=0,b=3,c=2}

S>?
S>Поведение первого случая полностью описано в документации — порядок GetValues определяется значениями.
S>Поэтому для обоих енумов во втором примере en будет принимать значения En.a, En.c, En.b.

S>Про второй пример есть два аспекта:

S>1. То, что енум слева никогда не станет енумом справа, гарантируется спецификацией языка. а получит значение 0, с получит значение 1, b получит значение 2.
S>2. А вот отличить енум слева от вот такого, в платформе невозможно: enum En{a=0,b=2,c=1}

P>>И о том, есть ли спецификация на порядок членов в Type, образованных typeOf.

S>Есть. Как уже ответили рядом, спецификация явно запрещает полагаться на порядок членов в Type. Не гарантируется его стабильность даже при последовательных вызовах GetMembers() в рамках одного запуска.

Ошибся в примере. Имел в виду, есть ли что-то в спецификации, что En{a,c,b} не будет преобразован в enum En{a=0,b=2,c=1}. Т.е. как писал ранее, речь не о значениях, а о порядке, который был бы, если бы typeOf его сохранял: я же писал что п.1. и п.2. вызывают сомнения в порядке членов.
Еще раз, вопрос не актуален.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.