异常类型可以是通用的吗?

时间:2011-05-23 15:01:21

标签: generics exception f#

我尝试过以下操作,但无效。

exception MyError<'a> of 'a
exception 'a MyError of 'a

我是否必须使用长格式:

type MyError<'a>(value) =
  inherit System.Exception()
  member this.Value : 'a = value

1 个答案:

答案 0 :(得分:6)

根据规范,您必须使用长格式。我没有找到任何解释为什么会这样,但是异常声明的语法看起来像这样(也许还暗示了为什么行为如你所描述的那样):

  

exception-defn:= attributes opt exception union-type-case-data

     

union-type-case-data:=
    ident (nullary union case)
    ident of 类型* ... *类型(n-ary union case)
    ident:uncurried-sig (n-ary union case)

这非常有趣,因为它表明异常声明更像是歧视的联合案例而不是类似的类型。我想你可以想到一个异常声明...

exception MyExn of int

...作为声明向标准System.Exception类型添加新案例(如果它是一个有区别的联盟)。在这种情况下,您不希望能够使用泛型类型参数:

type System.Exception = 
  | ...
  | MyExn of int