Как представлены единицы измерения?

Я только начинаю с F# и задаюсь вопросом о единицах измерения:

Я понимаю, что они присутствуют только во время компиляции, и Reflector подтверждает это: создание единицы измерения, которая не является псевдонимом, создает класс с MeasureAttribute атрибут, но кроме этого, float<km/h> представляется в виде простого System.Double, И нет никаких атрибутов типа, параметра конструктора или свойств.

Пока я понимаю. Но когда я ссылаюсь на скомпилированную сборку из другого проекта, она, кажется, знает все о единицах измерения, включая псевдонимы. Как он получает эту информацию? Где в сборке они?

1 ответ

Решение

F# хранит "дополнительную информацию о типе" в ресурсе скомпилированной сборки, и компилятор F# знает, как читать этот ресурс. Таким образом, в то время как дискриминационное объединение просто скомпилировано, скажем, в класс, а единица измерения стерта в двойное число, в ресурсе сборки есть дополнительная информация о типе, специфичная для F#, поэтому, когда компилятор F# читает его, он может восстановите дополнительные "метаданные F#".

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

Другие вопросы по тегам