Индексированные свойства статического члена - PullRequest
3 голосов
/ 23 марта 2011

Возможно ли создавать статические элементы с индексированными свойствами в F #? MSDN показывать их только для членов экземпляра, однако я могу определить следующий класс:

type ObjWithStaticProperty =
    static member StaticProperty
        with get () = 3
        and  set (value:int) = ()

    static member StaticPropertyIndexed1
        with get (x:int) = 3
        and  set (x:int) (value:int) = ()

    static member StaticPropertyIndexed2
        with get (x:int,y:int) = 3
        and  set (x:int,y:int) (value:int) = ()

//Type signature given by FSI:
type ObjWithStaticProperty =
  class
    static member StaticProperty : int
    static member StaticPropertyIndexed1 : x:int -> int with get
    static member StaticPropertyIndexed2 : x:int * y:int -> int with get
    static member StaticProperty : int with set
    static member StaticPropertyIndexed1 : x:int -> int with set
    static member StaticPropertyIndexed2 : x:int * y:int -> int with set
  end

Но когда я пытаюсь использовать один, я получаю ошибку:

> ObjWithStaticProperty.StaticPropertyIndexed2.[1,2] <- 3;;

  ObjWithStaticProperty.StaticPropertyIndexed2.[1,2] <- 3;;
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error FS1187: An indexer property must be given at least one argument

Я пробовал несколько разных вариантов синтаксиса, но ни один из них не работал.Также странно, что когда я наведу курсор мыши на set в VS2010 для одного из определений в типе, я получаю информацию о ExtraTopLevelOperators.set.

Ответы [ 2 ]

5 голосов
/ 23 марта 2011

Если вы хотите восстановить нотацию Type.Prop.[args], вы можете определить простой объект для представления индексируемого свойства с помощью свойства Item:

type IndexedProperty<'I, 'T>(getter, setter) =
  member x.Item 
    with get (a:'I) : 'T = getter a
    and set (a:'I) (v:'T) : unit = setter a v

type ObjWithStaticProperty =
    static member StaticPropertyIndexed1 = 
      IndexedProperty((fun x -> 3), (fun x v -> ()))

ObjWithStaticProperty.StaticPropertyIndexed1.[0]

Это возвращает новый экземпляр IndexedProperty каждый раз, поэтому может быть лучше его кэшировать. В любом случае, я думаю, что это довольно хороший трюк, и вы можете инкапсулировать некоторое дополнительное поведение в тип свойства.

Отступление: я думаю, что элегантное расширение для F # будет иметь первоклассных свойств , как у него первоклассных событий . (Например, вы можете создать свойства, которые автоматически поддерживают INotifyPropertyChange только с одной строкой кода)

4 голосов
/ 23 марта 2011

Я полагаю, что вы вызываете индексированные свойства с использованием другого синтаксиса (экземпляра или статического):

ObjWithStaticProperty.StaticPropertyIndexed2(1,2) <- 3

Единственное полус исключение - это свойство Item в экземпляре xможет быть вызван через x.[...] (то есть, Item опущено, и вокруг аргументов используются скобки).

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