seq{
for bit in BitArray(10) do
yield bit
}
bit
是bool
类型。我检查了ILSpy,并在生成的闭包之一中添加了显式强制转换。
BitArray
仅实现普通(非通用)IEnumerable
。 F#如何知道它是bool
?
答案 0 :(得分:13)
According to the F# 4.1 specification's Section 6.5.6 Sequence Iteration Expressions,如果IEnumerable
具有非IEnumerable
类型的Item
属性(突出显示),F#甚至对非通用object
也进行强制转换我的):
以下形式的表达式是序列迭代 表达式:
pat 的expr1 em> do expr2 完成
pat 的类型与枚举器值上 Current 属性的返回类型相同。然而, 如果 Current 属性的返回类型为 obj ,而集合类型为 ty 具有 Item 属性,其返回类型更为特定(非对象) ty2 ,键入 ty2 ,并在其中插入动态类型转换 将 v.Current 转换为 ty2 。
If we look at the source code for BitArray
,我们看到它确实具有类型为Item
的{{1}}属性:
bool
因此,F#在迭代时将显式转换为public bool this[int index] {
get {
return Get(index);
}
set {
Set(index,value);
}
}
。