Как представлены единицы измерения? - PullRequest
7 голосов
/ 23 июня 2011

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

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

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

1 Ответ

10 голосов
/ 23 июня 2011

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

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

...