voglio scrivere l'equivalente di questo C# in F #:Come dichiarare una struttura immutabile con campi pubblici?
struct Vector2 {
public readonly int X;
public readonly int Y;
public Vector2(int x, int y) {
X = x;
Y = y;
}
}
Questo costringe l'utente a fornire argomenti di creare un'istanza [EDIT: questo è sbagliato per i tipi di valore - tutti i tipi di valore hanno un costruttore di default] . Un vettore predefinito può essere fornito anche con un campo statico di sola lettura, ad esempio Vector2.Zero.
Sembra che l'unico modo per ottenere campi pubblici è tramite la parola chiave "val", ma non sembra lasciarmi loro inizializzare con il costruttore di default, e io non voglio avere due costruttori:
[<Struct>]
type MyInt(value) =
val public Value : int = value;;
val public Value : int = value;;
-------------------------------^
stdin(7,32): error FS0010: Unexpected symbol '=' in member definition
So che questo può essere fatto con associazioni membro, ma questo crea proprietà, non campi, se ho capito bene.
Purtroppo questo mi consente di creare un vettore senza passare parametri, in questo modo: 'let v = Vector2()'. Non che questo sia un problema molto serio, ma mi sto ancora chiedendo se può essere fatto senza avere un costruttore vuoto predefinito. – Asik
@Asik: lo stesso vale per il codice C#: questa è una limitazione CLR, non una limitazione F #. – ildjarn
"Le strutture non possono avere un costruttore di oggetti senza argomenti: questa è una restrizione imposta su tutti i linguaggi della CLI poiché le strutture supportano automaticamente un costruttore predefinito." - questo è quello che dice il compilatore, quindi non è sempre possibile ottenere ciò che si desidera ... –