Syntax 使用替代类语法在构造函数中添加代码

Syntax 使用替代类语法在构造函数中添加代码,syntax,f#,constructor,Syntax,F#,Constructor,我想在上面的构造函数中添加此代码: type Foo = class inherit Bar val _stuff : int new (stuff : int) = { inherit Bar() _stuff = stuff } end if(stuff

我想在上面的构造函数中添加此代码:

type Foo = 
    class
        inherit Bar

        val _stuff : int

        new (stuff : int) = {
            inherit Bar()
            _stuff = stuff
        }
    end
if(stuff<0)则引发(ArgumentOutOfRangeException“stuff必须为正”)
else()

我怎样才能在F#中做到这一点呢?

Hm,看起来就像语法上的一个漏洞;我会提出一个建议。您可以这样处理它:

if (stuff < 0) then raise (ArgumentOutOfRangeException "Stuff must be positive.")
else ()
type Bar()=类结束
类型Foo=
阶级
继承条
val_stuff:int
私有new(stuff:int,dummyUnused:int)={
继承条()
_东西
}
新的(资料:int)=
Foo(stuff,0)
然后
如果(stuff<0),那么
raise(System.ArgumentOutOfRangeException
“东西必须是正面的。”)
结束
其中,第一个构造函数是一个伪构造函数,其唯一目的是允许第二个实构造函数使用“其他构造函数然后是副作用”语法调用它

然而,如果你使用它,你会活得更长,更快乐

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
输入Foo(\u stuff:int)=
继承条()
做
如果(_stuff<0),则
raise(System.ArgumentOutOfRangeException“Stuff必须为正值”)
相反尽可能将类与主构造函数一起使用。(“主构造函数”是类声明中的构造函数-在上面的示例中,“type Foo”后面的参数是构造函数参数,而类体中的任何let/do语句都定义了主构造函数体。)

编辑:

这里有一个更简单的解决方法

type Foo(_stuff:int) =     
    inherit Bar()
    do
        if (_stuff < 0) then 
            raise (System.ArgumentOutOfRangeException "Stuff must be positive.")
类型Foo=
阶级
继承条
val_stuff:int
新的(资料:int)=
let效应=
如果(stuff<0),那么
raise(System.ArgumentOutOfRangeException
“东西必须是正面的。”)
{            
继承条()
_东西
}
结束

您可以在不需要任何解决方法的情况下执行此操作,但是初始左卷发的位置相当敏感(或者可能解析器有缺陷?)。要首先实现效果,请执行以下操作:

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
输入Foo=
班
继承条
val_stuff:int
新的(资料:int)=
如果stuff<0,则引发(System.ArgumentOutOfRangeException(“stuff必须为正”))
{ 
继承条()
_东西
}
结束
要实现第二种效果:

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
输入Foo=
班
继承条
val_stuff:int
新的(资料:int)=
{ 
继承条()
_东西
}
然后,如果stuff<0,则引发(System.ArgumentOutOfRangeException(“stuff必须为正”))
结束

谢谢!它只是工作。大括号的位置确实很挑剔。谢谢。我知道主ctor,在我的例子中,我需要几个ctor,所以唯一的方法是类/结束语法。
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