Информация об изменениях

Сообщение Re[2]: Минутка WTF-14: не повторяясь от 09.01.2017 10:21

Изменено 09.01.2017 10:28 dmitry_npi

Re[2]: Минутка WTF-14: не повторяясь
Здравствуйте, Sinix, Вы писали:

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


S>>Вывод отдельным ответом ибо спойлер.

S>
  ибо спойлер
S>
S>Type-level: 3 attributes
S>Assembly-level: 2 attributes
S>


S>как-то так, да.



Почему выводится это, понять можно: дизассемблировав сборку, видно, что повторяющийся атрибут туда просто не попал. (я имею в виду атрибут сборки, на атрибуты класса можно вообще забить).
Также можно упростить код атрибута до
public MyAttribute(string origin)
{
  // пусто           
}


То есть, мы можем сказать, что метод GetCustomAttributes тут ни при чём, просто компилятор не поместил повторяющийся атрибут в сборку, причём "одинаковость" он определяет только по параметрам конструктора, остальное (свойства) в счёт не идет.

Так что вопрос сводится к "зачем они так сделали?". Тут могут быть варианты:
  • Ненамеренно. Баг — самое простое предположение. Но с пятой версии должны были исправить, наверно.
  • Намеренно. Решили изменить поведение (а как же возможность прописывать несколько значений?). Для чего — не знаю.
Re[2]: Минутка WTF-14: не повторяясь
Здравствуйте, Sinix, Вы писали:

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


S>>Вывод отдельным ответом ибо спойлер.

S>
  ибо спойлер
S>
S>Type-level: 3 attributes
S>Assembly-level: 2 attributes
S>


S>как-то так, да.



Почему выводится это, понять можно: дизассемблировав сборку, видно, что повторяющийся атрибут туда просто не попал. (я имею в виду атрибут сборки, на атрибуты класса можно вообще забить).
Также можно упростить код атрибута до
public MyAttribute(string origin)
{
  // пусто           
}


То есть, мы можем сказать, что метод GetCustomAttributes тут ни при чём, просто компилятор не поместил повторяющийся атрибут в сборку, причём "одинаковость" он определяет только по параметрам конструктора, остальное (свойства) в счёт не идет.
Кстати, можно дизассемблировать сборку, прописать туда "пропавший" атрибут по аналогии и ассемблировать снова. Тогда получим ожидаемый результат.

Так что вопрос сводится к "зачем они так сделали?". Тут могут быть варианты:
  • Ненамеренно. Баг — самое простое предположение. Но с пятой версии должны были исправить, наверно.
  • Намеренно. Решили изменить поведение (а как же возможность прописывать несколько значений?). Для чего — не знаю.