这个FSharp如何动态运算符

时间:2014-12-07 05:14:23

标签: dynamic f# ado.net sqldatareader

我从Tomas Petricek找到了这个fssnip http://www.fssnip.net/hh。在使用ado.net SqlDataReader时,它很好地隐藏了许多非功能代码。与他在存储过程http://tomasp.net/blog/dynamic-sql.aspx/上的另一篇文章一起,它提供了一种使用原始查询和存储过程查询sql server的好方法。这对于想要使用原始查询但不够幸运且使用sqlclient类型提供程序的人来说非常有用。

但是,我无法弄清楚FSharp编译器/ CLR如何计算出以下函数的返回类型。

let (?) (reader:SqlDataReader) (name:string) : 'R =
  let typ = typeof<'R>
  if typ.IsGenericType && typ.GetGenericTypeDefinition() = typedefof<option<_>> then
     if reader.[name] = box DBNull.Value then 
        (box null) :?> 'R
     else typ.GetMethod("Some").Invoke(null, [| reader.[name] |]) :?> 'R
  else
     reader.[name] :?> 'R

当我在应用类似reader?amount之类的东西时对此函数设置断点时,(数量是浮点类型列)。当我将光标移动到函数签名上时,它会显示返回类型'R在执行此函数的单行代码之前是双精度型。编译器/ CLR实际上如何知道数量是数字加倍?功能中似乎没有什么可以帮助进行推理?

问候

casbby

1 个答案:

答案 0 :(得分:4)

所以这里的关键是'R

这可以在编译时使用标准类型推断从使用中推断出来。

不需要显式CLR支持来计算返回值(但是,如果类型不匹配,您将获得异常)