Добавление атрибутов к членам работает хорошо, потому что синтаксис такой же, как и при определении члена в типе.
[<TypeAttribute>]
let Foo () =
{
new Baz with
[<MethodAttribute>]
member x.Booga () = ()
}
Выше не удается скомпилировать с исключением AttributeUsage «Этот атрибут недопустим для использования на этом элементе языка».
Эта ошибка не исчезнет, даже если я добавлю подсказку атрибута:
[<type: TypeAttribute>]
Если атрибут перемещается рядом с выражением объекта, куда, по-видимому, имеет смысл переходить, код даже не анализируется.
let Foo () =
[<TypeAttribute>]
{
new Baz with
member x.Booga () = ()
}
Ошибка разбора: «Неожиданный символ» [<'в привязке. </p>
let Foo () =
{
[<TypeAttribute>]
new Baz with
member x.Booga () = ()
}
При перемещении атрибута здесь не выполняется синтаксический анализ с «Неожиданным символом» [<'в выражении. Ожидаемый'} 'или другим маркером "," Несоответствие "{" и "Неожиданное ключевое слово' member 'в определении ...". Худший результат пока. </p>
Итак, на данный момент я могу отказаться от использования выражения объекта в пользу частного типа в модуле.
[<TypeAttribute>]
type private myBaz () =
interface Bax with
member x.Booga () = ()
let Foo () = new myBaz ()
Это прекрасно работает, но я бы предпочел альтернативу, которая позволяет вместо этого использовать выражения объекта.
Есть ли альтернатива?