type Foo =
class
inherit Bar
val _stuff : int
new (stuff : int) = {
inherit Bar()
_stuff = stuff
}
end
我想在上面的构造函数中添加此代码:
if (stuff < 0) then raise (ArgumentOutOfRangeException "Stuff must be positive.")
else ()
如何在F#中实现这一目标?
答案 0 :(得分:5)
您可以在不需要任何解决方法的情况下执行此操作,但初始左侧卷曲的位置相当敏感(或者解析器可能有错误?)。首先要做到这一点:
type Foo =
class
inherit Bar
val _stuff : int
new (stuff : int) =
if stuff < 0 then raise (System.ArgumentOutOfRangeException("Stuff must be positive"))
{
inherit Bar()
_stuff = stuff
}
end
要做第二个效果:
type Foo =
class
inherit Bar
val _stuff : int
new (stuff : int) =
{
inherit Bar()
_stuff = stuff
}
then if stuff < 0 then raise (System.ArgumentOutOfRangeException("Stuff must be positive"))
end
答案 1 :(得分:3)
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
其中第一个构造函数是一个虚拟对象,其唯一目的是允许第二个真正的构造函数使用“other-constructor then side-effect”语法调用它。
但是如果你使用
,你将过上更长寿,更幸福的生活type Foo(_stuff:int) =
inherit Bar()
do
if (_stuff < 0) then
raise (System.ArgumentOutOfRangeException "Stuff must be positive.")
代替。 尽可能使用具有主构造函数的类。('主构造函数'是类声明中的构造函数 - 在上面的示例中,紧跟在“类型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