Как F # узнает, что элементы bitArray являются bool при перечислении в seq builder? - PullRequest
0 голосов
/ 14 января 2019
    seq{
        for bit in BitArray(10) do 
        yield bit
    }

bit относится к типу bool. Я проверил с помощью ILSpy, и в одно из сгенерированных замыканий добавлено явное приведение.

BitArray реализует только простые (не общие) IEnumerable. Как F # узнает, что это bool?

1 Ответ

0 голосов
/ 14 января 2019

В соответствии со спецификацией F # 4.1 Раздел 6.5.6 Выражения итерации последовательности , F # выполняет приведение даже для неуниверсального IEnumerable, если IEnumerable имеет свойство Item с типом, отличным от object (выделение шахты):

Выражение следующего вида является итерацией последовательности выражение:

для pat in expr1 do expr2 сделано

Тип pat совпадает с типом возврата свойства Current для значения перечислителя. Тем не мение, если свойство Current имеет тип возврата obj и тип коллекции ty имеет свойство Item с более конкретным (необъектным) типом возвращаемого значения ty2 , тип ty2 используется вместо этого, и динамическое приведение вставляется в преобразовать v.Current в ty2 .

Если мы посмотрим на исходный код BitArray, мы увидим, что у него действительно есть свойство Item с типом bool:

public bool this[int index] {
        get {
            return Get(index);
        }
        set {
            Set(index,value);
        }
}

Таким образом, F # явно приведёт к bool во время итерации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...