【发布时间】:2011-04-12 23:03:09
【问题描述】:
在下面的 sn-p 中,我试图提取包含在嵌套元组中的 recid,该元组形成一个 dict 键。 嵌套元组格式为 (Int32, (boolean, boolean)) -
我正在寻找 Int32 项的值(即 实际上是 db 记录的行 ID)。
在下面的匹配代码中,我尝试将 recid 添加到列表中,但首先我将对象转换为整数。
但是,这会产生以下错误 - 不知道为什么?
错误:
此运行时强制或类型测试从类型 'a 到 int32
涉及基于此程序点之前的信息的不确定类型。
某些类型不允许运行时类型测试。需要进一步的类型注释。
此处引用的字典定义为:
// Create Dict
let rdict = new Dictionary<_,_>()
// Add elements
rdict.Add( (x.["PatientID"],(true,true) ),ldiff)
// Extract Dict items
let reclist = new ResizeArray<int32>()
for KeyValue(k,v) in rdict do
match k with
| ((recid,(true,true)) ->
printfn "Found a matching Record: %A " recid; // <- prints correct result
let n = (recid:?> int32) // <- coercion error
reclist.Add(n)
【问题讨论】:
-
rdict.Add( (x.["PatientID"],(true,true) )行的左括号和右括号的数量不匹配。Dictionary的键和值类型是什么?int*(bool*bool)是否仅用作键类型,或者int是键类型而bool*bool是值类型?另外,x.["PatientID"]的实际类型是什么?这会返回一个int还是一个装箱的int(即obj,可以转换为int)? -
糟糕 - 我在发布 rdict.add 行时搞砸了 - 现在已更正。 (我实际上/正在构建一个行/列对列表作为dict值。dict键实际上是一个复合(rid,(boolean,boolean))值。(布尔值定义rec是否存在于一对表中). x.["PatientID"] 是从 db 表中检索到的(未装箱的)int 值。
-
实际上,还有一个问题——如果伴随的
bool对是true, true而不是任何其他组合,您是否打算只将rdict中的ID 复制到reclist? /跨度> -
@ildjarn:我在这里比较 2 个 db 表,所以对于报告摘要,我希望选择为几个不同的匹配条件(例如,相交计数;a 不在 b 计数中;b 不计数)。顺便说一句,我认为装箱和拆箱值可能会起作用(不确定为什么当 printfn 正确处理 cvn 时需要这样做) - 我需要进一步测试它。
-
printfn正确处理recid因为您使用%A作为格式说明符,它适用于任何类型;我怀疑如果您使用%d作为格式说明符,它会失败,这意味着x.["PatientID"]实际上不返回int。假设您使用的是 Visual Studio,您不能将鼠标悬停在rdict上并查看工具提示中的类型吗?
标签: f# dictionary casting match tuples