F #: есть ли способ добавить атрибуты к выводу типа с помощью ObjectExpression - PullRequest
2 голосов
/ 11 февраля 2010

Добавление атрибутов к членам работает хорошо, потому что синтаксис такой же, как и при определении члена в типе.

[<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 ()

Это прекрасно работает, но я бы предпочел альтернативу, которая позволяет вместо этого использовать выражения объекта.

Есть ли альтернатива?

1 Ответ

6 голосов
/ 11 февраля 2010

Атрибуты нельзя использовать в объектных выражениях, хотя это кажется разумным предложением для будущего расширения языка (я внесу предложение).

http://msdn.microsoft.com/en-us/library/dd233179(VS.100).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...