f# - 强制执行显式类型参数

标签 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)

最佳答案

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

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

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

您可以在 F# specification 的第 16 节(第 217 页)中找到该属性。 :

When applied to an F# function or method, indicates that the function or method must be given explicit type arguments when used. For example, typeof<int>. This attribute should be used only in F# assemblies.

关于f# - 强制执行显式类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6042899/

相关文章:

F#:不能在签名中隐藏类型缩写?为什么不?

javascript - 管理 Sitelet 中的资源

c++ - 为什么内联函数会有多个相同的定义?

c++ - 什么是 C++ 内联类?

c++ - Streams 中的内联忽略

css - 自动生成的边距显示内联

永远不会匹配与元组规则匹配的 F# 模式

f# - 我在 F# 中分块列表时做错了什么

recursion - 访问列表列表中的第一个元素 [F#]

generics - 使包装的 F# SRTP 函数通用