Chcę napisać równowartość tej C# w F #:Jak zadeklarować niezmienny struct z polami publicznymi?
struct Vector2 {
public readonly int X;
public readonly int Y;
public Vector2(int x, int y) {
X = x;
Y = y;
}
}
Zmusza to użytkownika do dostarczyć argumentów do utworzenia instancji [EDIT: to jest złe dla typów wartości - wszystkie typy wartości mają domyślnego konstruktora] . Domyślny Vector2 może być również wyposażony w statyczne pole tylko do odczytu, tj. Vector2.Zero.
Wygląda na to, że jedynym sposobem uzyskania pól publicznych jest słowo kluczowe "val", ale nie pozwala mi na zainicjowanie ich za pomocą domyślnego konstruktora, a nie chcę mieć dwóch konstruktorów:
[<Struct>]
type MyInt(value) =
val public Value : int = value;;
val public Value : int = value;;
-------------------------------^
stdin(7,32): error FS0010: Unexpected symbol '=' in member definition
Wiem, że można to zrobić z powiązaniami członków, ale to tworzy właściwości, a nie pola, jeśli dobrze rozumiem.
Niestety, pozwala mi to utworzyć wektor bez przekazywania parametrów, jak na przykład: 'let v = Vector2()'. Nie chodzi o to, że jest to bardzo poważny problem, ale wciąż zastanawiam się, czy można to zrobić bez domyślnego pustego konstruktora. – Asik
@Asik: To samo dotyczy kodu C# - jest to ograniczenie CLR, a nie ograniczenie F #. – ildjarn
"Struktury nie mogą mieć konstruktora obiektu bez argumentów, jest to ograniczenie nałożone na wszystkie języki interfejsu CLI, ponieważ struktury automatycznie obsługują domyślny konstruktor." - tak mówi kompilator, więc nie zawsze możesz dostać to, czego chcesz ... –