Я хочу написать эквивалент этой C# в F #:Как объявить неизменяемую структуру с открытыми полями?
struct Vector2 {
public readonly int X;
public readonly int Y;
public Vector2(int x, int y) {
X = x;
Y = y;
}
}
Это заставляет пользователя предоставить аргументы для создания экземпляра [EDIT: это неправильно для типов значений - все типы значений иметь конструктор по умолчанию] , Вектор Vector по умолчанию также может быть снабжен статическим полем readonly, то есть Vector2.Zero.
Похоже, что единственный способ получить открытые поля осуществляется с помощью ключевого слова «ВАЛ», но, кажется, не дайте мне инициализировать их с конструктором по умолчанию, и я не хочу иметь два конструктора:
[<Struct>]
type MyInt(value) =
val public Value : int = value;;
val public Value : int = value;;
-------------------------------^
stdin(7,32): error FS0010: Unexpected symbol '=' in member definition
Я знаю, что это можно сделать с привязками элементов, но это создает свойства, а не поля, если я хорошо понимаю.
К сожалению, это позволяет мне создать вектор без параметров, например: 'let v = Vector2()'. Не то, чтобы это очень серьезная проблема, но мне все еще интересно, можно ли это сделать без использования пустого конструктора по умолчанию. – Asik
@Asik: То же самое относится к вашему C# -коду - это ограничение CLR, а не ограничение F #. – ildjarn
«Структуры не могут иметь конструктора объектов без аргументов. Это ограничение, наложенное на все языки CLI, поскольку структуры автоматически поддерживают конструктор по умолчанию». - это то, что компилятор говорит, поэтому вы не всегда можете получить то, что хотите ... –