Как представлены единицы измерения?
Я только начинаю с F # и задаюсь вопросом об единицах измерения:
Я понимаю, что они присутствуют только во время компиляции, и Reflector подтверждает это: создание единицы измерения, которая не является псевдонимом, создает класс с атрибутом MeasureAttribute
, но кроме этого float<km/h>
представляется как обычный System.Double
. И нет атрибутов типа, конструктора или свойств.
До сих пор я понимаю. Но когда я ссылаюсь на собранную сборку из другого проекта, он, похоже, знает все единицы измерения, включая псевдонимы. Как он получает эту информацию? Где в сборке они?
Ответы
Ответ 1
F # хранит "дополнительную информацию о типе" в ресурсе компилируемой сборки, а компилятор F # знает, как читать этот ресурс. Таким образом, в то время как дискриминационный союз просто скомпилирован, скажем, в класс, а единица измерения стирается в двойную, там дополнительная информация типа F # в ресурсе в сборке, так что когда компилятор F # его читает, он может перестроить дополнительные "метаданные F #".
PowerPack имеет считыватель метаданных, который позволяет вам обращаться к нему программно.