Хм, похоже на дыру в грамматике; Я внесу предложение. Вы можете обойти это следующим образом:
type Bar() = class end
type Foo =
class
inherit Bar
val _stuff : int
private new (stuff : int, dummyUnused : int) = {
inherit Bar()
_stuff = stuff
}
new (stuff : int) =
Foo(stuff, 0)
then
if (stuff < 0) then
raise (System.ArgumentOutOfRangeException
"Stuff must be positive.")
end
где первый конструктор является фиктивным, единственной целью которого является позволить второму реальному конструктору вызывать его с синтаксисом «другой конструктор, затем побочный эффект».
Однако вы проживете более долгую и счастливую жизнь, если будете использовать
type Foo(_stuff:int) =
inherit Bar()
do
if (_stuff < 0) then
raise (System.ArgumentOutOfRangeException "Stuff must be positive.")
вместо. По возможности используйте классы с первичными конструкторами. («Первичный конструктор» — это конструктор в объявлении класса. В приведенном выше примере аргументы сразу после «type Foo» являются аргументами конструктора, а любые значения let Операторы /do внутри тела класса определяют тело основного конструктора.)
РЕДАКТИРОВАТЬ:
Вот гораздо более простой обходной путь
type Foo =
class
inherit Bar
val _stuff : int
new (stuff : int) =
let effect =
if (stuff < 0) then
raise (System.ArgumentOutOfRangeException
"Stuff must be positive.")
{
inherit Bar()
_stuff = stuff
}
end
person
Brian
schedule
17.11.2009