在seq生成器中枚举时,F#如何知道bitArray元素是布尔值?

时间:2019-01-14 20:09:49

标签: f#

    seq{
        for bit in BitArray(10) do 
        yield bit
    }

bitbool类型。我检查了ILSpy,并在生成的闭包之一中添加了显式强制转换。

BitArray仅实现普通(非通用)IEnumerable。 F#如何知道它是bool

1 个答案:

答案 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); } }