Здравствуйте, Аноним, Вы писали:
А>Совершенно непонятно
Потому что атрибуты — это, по сути, значения которые будут записаны в метаданные сборки. Они вычисляются на этапе компиляции, поэтому переменные использовать нельзя.
Re[2]: Почему в атрибут можно передать только константы ?
От:
Аноним
Дата:
17.03.14 16:02
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>Совершенно непонятно
А>Потому что атрибуты — это, по сути, значения которые будут записаны в метаданные сборки. Они вычисляются на этапе компиляции, поэтому переменные использовать нельзя.
А все остальное разве не записывается?
Почему же нельзя вычислить значение выражения? например new Foo(1) ?
Re[3]: Почему в атрибут можно передать только константы ?
Здравствуйте, Аноним, Вы писали:
А>А все остальное разве не записывается? А>Почему же нельзя вычислить значение выражения? например new Foo(1) ?
Аттрибуты и их значения — это часть метаданных, которые доступны вне среды исполнения, и используются теми или иными тулзами (и самим компилятором). Как такое можно обеспечить для new Foo(1) — совершенно непонятно.
Re[4]: Почему в атрибут можно передать только константы ?
От:
Аноним
Дата:
17.03.14 17:01
Оценка:
Здравствуйте, fddima, Вы писали:
Т.е. для этого нам нужно сгенерировать il код, а его нельзя записать туда, куда пишется информация об атрибутах, в этом причина?
Re: Почему в атрибут можно передать только константы ?
Здравствуйте, Аноним, Вы писали:
А>Почему в атрибут можно передать только константы ? А>Совершенно непонятно
Во-первых, не любые константы. Например, decimal не поддерживается.
Во-вторых, не только константы. Допускаются одномерные (в т.ч. вложенные) массивы и typeof-выражения, которые имеют тип System.Type и формально не являются константами.
Атрибуты должны записываться в метаданные во время компиляции, поэтому там не может быть никаких ссылок на данные, возникающие в процессе выполнения программы (значения полей, результаты вызовов методов и т.д.) Набор выражений, разрешённых в атрибутах, определяется форматом метаданных для атрибутов, который поддерживается CLR. Этот формат был выбран достаточно произвольно, исходя из тех потребностей, которые возникали в процессе разработки CLR и BCL.
Мы могли бы представить, что этот формат мог бы быть гораздо более гибким, например, поддерживать decimal, DateTime, Guid, любые blittable структуры, BigInteger, многомерные массивы, XML, expression trees и т.д. и т.п. Но в реальности он разрабатывался с учётом ограниченных временных и человеческих ресурсов и поддерживает весьма ограниченный набор типов. Предполагается, что возможность использовать строки или массивы байтов в принципе позволяет закодировать в атрибутах произвольные структуры данных, однако в этом случае не приходится рассчитывать ни на какую помощь от компилятора с их кодированием.
Re[5]: Почему в атрибут можно передать только константы ?
Здравствуйте, Аноним, Вы писали:
А>Т.е. для этого нам нужно сгенерировать il код, а его нельзя записать туда, куда пишется информация об атрибутах, в этом причина?
nikov, рядом описал причины.
Я же говорил о том — что при чтении метаданных — никакой код не исполняется, и ожидается, что он не исполняется. Студия, к примеру, метаданные эти читает. Ну и компилятор тоже. И для того что бы читать метаданные CLR — по сути — иметь полноценный рантайм не нужно.
Re[2]: Почему в атрибут можно передать только константы ?
От:
Аноним
Дата:
18.03.14 06:20
Оценка:
Здравствуйте, nikov, спасибо, стало яснее!
А может быть так, что к тому же сознательно не хотели делать этот механизм слишком мощным дабы люди не увлекались? Или же исключительно ограниченность ресурсов и приоритеты?
Re[3]: Почему в атрибут можно передать только константы ?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, nikov, спасибо, стало яснее!
А>А может быть так, что к тому же сознательно не хотели делать этот механизм слишком мощным дабы люди не увлекались? Или же исключительно ограниченность ресурсов и приоритеты?
Я не знаю фактических деталей, но моё личное впечатление от спецификации CLI Ecma-335 — что атрибуты делались на скорую руку. На фоне продуманной реляционной структуры метаданных их формат выглядят очень денормализованным и ad hoc.