Почему в атрибут можно передать только константы ?
От: Аноним  
Дата: 17.03.14 15:29
Оценка:
Совершенно непонятно
Re: Почему в атрибут можно передать только константы ?
От: Аноним  
Дата: 17.03.14 15:47
Оценка: +3
Здравствуйте, Аноним, Вы писали:

А>Совершенно непонятно



Потому что атрибуты — это, по сути, значения которые будут записаны в метаданные сборки. Они вычисляются на этапе компиляции, поэтому переменные использовать нельзя.
Re[2]: Почему в атрибут можно передать только константы ?
От: Аноним  
Дата: 17.03.14 16:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>>Совершенно непонятно



А>Потому что атрибуты — это, по сути, значения которые будут записаны в метаданные сборки. Они вычисляются на этапе компиляции, поэтому переменные использовать нельзя.


А все остальное разве не записывается?
Почему же нельзя вычислить значение выражения? например new Foo(1) ?
Re[3]: Почему в атрибут можно передать только константы ?
От: fddima  
Дата: 17.03.14 16:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А все остальное разве не записывается?

А>Почему же нельзя вычислить значение выражения? например new Foo(1) ?
Аттрибуты и их значения — это часть метаданных, которые доступны вне среды исполнения, и используются теми или иными тулзами (и самим компилятором). Как такое можно обеспечить для new Foo(1) — совершенно непонятно.
Re[4]: Почему в атрибут можно передать только константы ?
От: Аноним  
Дата: 17.03.14 17:01
Оценка:
Здравствуйте, fddima, Вы писали:

Т.е. для этого нам нужно сгенерировать il код, а его нельзя записать туда, куда пишется информация об атрибутах, в этом причина?
Re: Почему в атрибут можно передать только константы ?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 17.03.14 21:28
Оценка: 8 (1)
Здравствуйте, Аноним, Вы писали:

А>Почему в атрибут можно передать только константы ?

А>Совершенно непонятно

Во-первых, не любые константы. Например, decimal не поддерживается.
Во-вторых, не только константы. Допускаются одномерные (в т.ч. вложенные) массивы и typeof-выражения, которые имеют тип System.Type и формально не являются константами.

Атрибуты должны записываться в метаданные во время компиляции, поэтому там не может быть никаких ссылок на данные, возникающие в процессе выполнения программы (значения полей, результаты вызовов методов и т.д.) Набор выражений, разрешённых в атрибутах, определяется форматом метаданных для атрибутов, который поддерживается CLR. Этот формат был выбран достаточно произвольно, исходя из тех потребностей, которые возникали в процессе разработки CLR и BCL.

Мы могли бы представить, что этот формат мог бы быть гораздо более гибким, например, поддерживать decimal, DateTime, Guid, любые blittable структуры, BigInteger, многомерные массивы, XML, expression trees и т.д. и т.п. Но в реальности он разрабатывался с учётом ограниченных временных и человеческих ресурсов и поддерживает весьма ограниченный набор типов. Предполагается, что возможность использовать строки или массивы байтов в принципе позволяет закодировать в атрибутах произвольные структуры данных, однако в этом случае не приходится рассчитывать ни на какую помощь от компилятора с их кодированием.
Re[5]: Почему в атрибут можно передать только константы ?
От: fddima  
Дата: 17.03.14 21:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Т.е. для этого нам нужно сгенерировать il код, а его нельзя записать туда, куда пишется информация об атрибутах, в этом причина?

nikov, рядом описал причины.
Я же говорил о том — что при чтении метаданных — никакой код не исполняется, и ожидается, что он не исполняется. Студия, к примеру, метаданные эти читает. Ну и компилятор тоже. И для того что бы читать метаданные CLR — по сути — иметь полноценный рантайм не нужно.
Re[2]: Почему в атрибут можно передать только константы ?
От: Аноним  
Дата: 18.03.14 06:20
Оценка:
Здравствуйте, nikov, спасибо, стало яснее!

А может быть так, что к тому же сознательно не хотели делать этот механизм слишком мощным дабы люди не увлекались? Или же исключительно ограниченность ресурсов и приоритеты?
Re[3]: Почему в атрибут можно передать только константы ?
От: hardcase Пират http://nemerle.org
Дата: 18.03.14 11:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А может быть так, что к тому же сознательно не хотели делать этот механизм слишком мощным дабы люди не увлекались?


Формат атрибутов не менялся с эпохи .NET 1.0, тогда даже обобщенных типов не было. Он получился таким, каким получился.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: Почему в атрибут можно передать только константы ?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 18.03.14 20:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, nikov, спасибо, стало яснее!


А>А может быть так, что к тому же сознательно не хотели делать этот механизм слишком мощным дабы люди не увлекались? Или же исключительно ограниченность ресурсов и приоритеты?


Я не знаю фактических деталей, но моё личное впечатление от спецификации CLI Ecma-335 — что атрибуты делались на скорую руку. На фоне продуманной реляционной структуры метаданных их формат выглядят очень денормализованным и ad hoc.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.