Почему атрибуты "специальные" в этом случае
Вы определяете не ту часть как особенную. Особенность атрибутов заключается в том, что существует синтаксис для комбинации создания и установки открытых свойств для объекта, связанного с полями, классами, методами и т. Д.
Другими словами, особенность атрибутов в том, что они являются атрибутами!
Действительно, это даже не атрибут, который является особенным; как вы сказали сами, вы можете создать экземпляр того же класса с инициализатором, как и любой другой. Это особый синтаксис атрибута.
Он должен разрешать возможность вызова открытого конструктора (или конструирование никогда не будет возможно), и он должен разрешать установку открытых свойств (или свойства никогда не будут установлены). Следует также отметить, что это предшествует введению синтаксиса инициализатора в C #, поэтому когда-то было возможно объединить конструирование и немедленную установку открытых свойств в одной синтаксической единице в случае атрибутов.
При таком рассмотрении нет смысла сравнивать то, как вещи работают с инициализаторами, поскольку их не было, когда принимались соответствующие проектные решения.
Итак, давайте просто рассмотрим [Foo(Bar = "hello world")]
самостоятельно и подумаем, когда Bar
должен быть настроен таким образом.
Причины, по которым это разрешено, когда Bar
публично, должны быть довольно очевидными.
Причины, по которым это не разрешается, когда Bar
является приватным, также должны быть довольно очевидными.
Когда его внутренний, есть два разумных выбора; не разрешать или разрешать, когда атрибут существует в данной сборке.
Таким образом, вопрос в том, насколько полезно иметь атрибут, который является открытым (если бы он сам был внутренним, мы могли бы достичь того же с общедоступными свойствами) и, следовательно, его можно использовать в других сборках, но который имеет внутренние свойства это может быть установлено только при использовании атрибутов из той же сборки. Если бы это было супер-полезно, то стоило бы дополнительной работы и сложности позволить это. Если это не было супер-полезно, то лучше, чтобы теория (спецификация) и практика (компилятор) не допустили этого.
Казалось бы, это не считалось сверхполезным.