F # - вызвать метод и присвоить свойству в конструкторе - PullRequest
0 голосов
/ 24 августа 2018

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

namespace Model

type MyClass() = 
    do
        MyProperty <- GenerateString()

    member val public MyProperty = ""
        with get, set

    member public this.GenerateString() = 
        "this is a string"

Ошибка компиляции: FS0039 Значение или конструктор MyProperty не определены.

Что я могу сделать, чтобы это исправить?

Я вставил код C #, чтобы продемонстрировать, что я пытаюсь сделать:

public class MyClass
{
    public string MyProperty { get; set; }

    public MyClass()
    {
        MyProperty = GenerateString();
    }

    private string GenerateString()
    {
        return "this is a string";
    }
}

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Вы получаете ошибку компилятора, потому что вам нужно определить ссылку на текущий экземпляр MyClass для использования в конструкторе. Однако, даже если вы сделаете это, вы обнаружите, что код не выполняется во время выполнения:

type MyClass() as self = 
    do
        self.MyProperty <- self.GenerateString()

    member val public MyProperty = ""
        with get, set

    member public this.GenerateString() = 
        "this is a string"

Это не с ошибкой System.InvalidOperationException: The initialization of an object or value resulted in an object or value being accessed recursively before it was fully initialized.

Я бы предложил использовать локальную привязку внутри класса для размещения значения свойства вместо попытки изменить свойство класса внутри конструктора. Примерно так:

type MyClass() as self = 

    let mutable value = ""
    do value <- self.GenerateString()

    member public this.MyProperty
        with get() = value
        and set (v) = value <- v

    member public this.GenerateString() = 
        "this is a string"
0 голосов
/ 24 августа 2018

Аарон дал хороший ответ, но вот альтернатива:

type MyClass() = 
    let genString () = "this is a string"
    member val public MyProperty = genString() with get, set
    member public this.GenerateString = genString
...