强制显式类型参数

时间:2011-05-18 09:59:06

标签: f# inline

我有一个通用函数,很容易让编译器推断错误的类型参数。类型参数仅控制返回类型,如果我不小心错过了类型注释,编译器会推断obj

如何在不给它显式类型参数的情况下调用我的函数,使其成为编译时错误? Unchecked.defaultof函数按我喜欢的方式工作:

> Unchecked.defaultof;;

  Unchecked.defaultof;;
  ^^^^^^^^^^^^^^^^^^^

stdin(1,1): error FS0685: The generic function 'defaultof' must be given explicit type argument(s)

2 个答案:

答案 0 :(得分:10)

defaultof函数使用特殊属性。 F#源代码再次有用。该函数的实现位于prim-types.fs,但该属性已添加到接口文件prim-types.fsi中。合并声明将是:

[<RequiresExplicitTypeArguments>] 
let inline unsafeDefault<'T> : 'T = (# "ilzero !0" type ('T) : 'T #)

内联IL (# ... #)仅限于F#核心,但声明是任何人都可以使用的。

您可以在F# specification

的第16节(第217页)中找到该属性
  

当应用于F#函数或方法时,表示在使用时必须为函数或方法指定显式类型参数。例如,typeof<int>。   此属性只能在F#程序集中使用。

答案 1 :(得分:7)