我从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
答案 0 :(得分:4)
所以这里的关键是'R
。
这可以在编译时使用标准类型推断从使用中推断出来。
不需要显式CLR支持来计算返回值(但是,如果类型不匹配,您将获得异常)