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

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

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

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

Ответ 1

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

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