Folgen Sie Code C #:

var body = new CustomerRequest
{
    Method = "CREDIT_CARD",
    CreditCard = new Creditcard
    {
        ExpirationMonth = "06",
        ExpirationYear = "2022",
        Number = "4012001037141112",
        Cvc = "123"
    }
};

Ich bin neu in F #, ich kann keine Klassen wie C # instanziieren. Siehe den folgenden Code in F #:

let body = CustomerRequest
(
    Method = "CREDIT_CARD"     // Help here
)

Ich kann C # nicht in F # konvertieren

4
Matheus Miranda 20 Jän. 2019 im 00:57

3 Antworten

Beste Antwort

Wenn Sie nur verwenden möchten benannte Argumente zum Festlegen der Eigenschaften der Klassen, die Sie erstellen: Die Syntax ist C # ziemlich ähnlich. Die Einrückungsstufe muss mit der des ersten Arguments übereinstimmen.

let body =
    CustomerRequest(
        Method = "CREDIT_CARD",
        CreditCard =
            Creditcard(
                ExpirationMonth = "06",
                ExpirationYear = "2022",
                Number = "4012001037141112",
                Cvc = "123" ) )
2
kaefer 19 Jän. 2019 im 22:54

Wenn Sie idiomatische F # ausführen, modellieren Sie dies mit Datensätzen anstelle von classes.

Du könntest es so machen:

type CreditCard = {
    ExpirationMonth: int;
    //More
}

type CustomerRequest = {
    Method: string;
    CreditCard: CreditCard;
}

let req = {
    Method = "Credit"
    CreditCard = {
        ExpirationMonth = 6
        //More
    }
}

Der Compiler verfügt über eine Typinferenz, dh er kann anhand der darin enthaltenen Felder erraten, dass req ein CustomerRequest ist, und das Gleiche gilt für CreditCard. Sie können den Typ angeben, wenn Sie dies tun muss wirklich.

Wenn Sie wirklich nach dem Unterricht sind - vielleicht müssen Sie mit C # -Code interopieren, dann würden Sie es so machen:

type CreditCard2(expirationMonth:int) = 
    member this.ExpirationMonth = expirationMonth

type CustomerRequest2(method: string, creditCard: CreditCard2) = 
    member this.Method = method
    member this.CreditCard = creditCard

let req2 = CustomerRequest2 ("Credit", CreditCard2 (5))
3
DaveShaw 19 Jän. 2019 im 22:29

Ich denke das ist wonach du suchst:

CreditCard.fs

namespace StackOverflow

type CreditCard() =
    member val ExpirationDate = "" with get, set
    member val ExpirationYear = "" with get, set
    member val Number = "" with get, set
    member val Cvc = "" with get, set

type CustomerRequest() =
    member val Method = "" with get, set
    member val CreditCard = new CreditCard() with get, set

Program.fs

open System
open StackOverflow

[<EntryPoint>]
let main argv =
    let body = new CustomerRequest(Method = "CREDIT_CARD",
                                        CreditCard = CreditCard(
                                            ExpirationDate = "06",
                                            ExpirationYear = "2022",
                                            Number = "4012001037141112",
                                            Cvc = "123"
                                        ))
    0

Ich weiß nicht viel über F #, daher ist die Verwendung von Records wie David Shaw vielleicht besser im Design. Grundsätzlich können Sie dies jedoch ohne einen Parameterkonstruktor und ohne einen veränderlichen Nicht-Eigenschaftswert in Ihrem Typ tun.

2
izzy255 19 Jän. 2019 im 23:29