Можно ли объявить абстрактное автоматически реализуемое свойство в F #?

#.net #f# #c#-to-f#

#.net #f# #c #-to-f#

Вопрос:

Я пытаюсь выполнить следующий эквивалент F #:

 [C#]
public virtual int Property { get; set; }
 

Но этот код (и многие другие комбинации) не работает:

 [F#]
abstract member Id: int with get, set
default val this.Id = 123 with get, set
 

Комментарии:

1. ну, ваш первый пример (C #) не является абстрактным автоматическим свойством… Это виртуальное автоматическое свойство

2. Почему вы пытаетесь сделать его абстрактным — это не то, что делает код C #. Существует большая разница между виртуальным и абстрактным.

3. В F # ключевые слова abstract default используются для получения того же результата, что и в C # virtual.

4.Пример (с задним полем): [<DefaultValue>] val mutable private name: string abstract member Name:string with get, set default this.Name with get() = this.name and set v = this.name <- v

Ответ №1:

Это невозможно в предварительном просмотре Dev11.

Ответ №2:

Хорошо, просматривая документацию MSDN по свойствам F #, эта строка в абстрактных свойствах сразу выскакивает:

В качестве альтернативы, abstract может просто означать, что свойство является виртуальным, и в этом случае определение должно присутствовать в том же классе.

Пример синтаксиса, который они дают, таков:

 type Base1() =
   let mutable value = 10
   abstract Property1 : int with get, set
   default this.Property1 with get() = value and set(v : int) = value <- v
 

Теперь я не слишком хорошо знаком с F #, но я предполагаю, что вы могли бы установить let mutable value = 10 в соответствии с вашими требованиями let mutable value = 123

Комментарии:

1. Спасибо за вашу помощь, но это не автоматически реализуемое свойство. Я стараюсь не использовать поле поддержки.

2. Автоматически реализованное свойство — это новая функция (F # 3.0)

3. Ах, это правда. Прочитав документацию и то, как она структурирована, я не уверен, что это возможно (поскольку ваш код кажется наиболее вероятным способом сделать это)