Вот тривиальная структура С#, которая выполняет некоторую проверку на аргументе ctor:
public struct Foo
{
public string Name { get; private set; }
public Foo(string name)
: this()
{
Contract.Requires<ArgumentException>(name.StartsWith("A"));
Name = name;
}
}
Мне удалось перевести это в класс F #:
type Foo(name : string) =
do
Contract.Requires<ArgumentException> (name.StartsWith "A")
member x.Name = name
Однако я не могу перевести это в структуру в F #:
[<Struct>]
type Foo =
val Name : string
new(name : string) = { do Contract.Requires<ArgumentException> (name.StartsWith "A"); Name = name }
Это дает ошибки компиляции:
Недопустимое выражение записи, последовательности или вычисления. Выражения последовательности должны быть форма 'seq {...}'
Это не допустимое выражение для построения объекта. Явные конструкторы объектов должны либо вызвать альтернативный конструктор, либо инициализировать все поля объекта и указать вызов конструктора суперкласса.
Я посмотрел this и this, но они не охватывают проверку аргумента.
Где я делаю неправильно?