Ответ 1
То, как вывод типа F # работает в разных контекстах с разными синтаксическими объектами, совпадающими с тем же именем, которые в случае int
могут быть любыми из:
- Функция
int:'T->int
полного имениMicrosoft.FSharp.Core.Operators.int
-
type int = int32
полного имениMicrosoft.FSharp.Core.int
-
type int<'Measure> = int
полного имениMicrosoft.FSharp.Core.int<_>
Один из способов демонстрации этой работы - это следующий сценарий: если мы просто вводим
int;;
в FSI мы получим что-то вроде
val it : (int -> int) = <fun:[email protected]>
Другими словами, это функция, которая не может иметь связанное с ней свойство MaxValue
:
> int.MaxValue;;
int.MaxValue;;
----^^^^^^^^
... error FS0039: The field, constructor or member 'MaxValue' is not defined
То же самое относится к int32
, который, будучи использованным в контексте выражения, вызывается FSI как просто еще одна функция с сигнатурой (int -> int32)
.
Теперь, когда дело доходит до
type num = int
в этом контексте int
вызывается как аббревиатура имени типа для System.Int32
, поэтому num
также является аббревиатурой типа, но теперь имя двусмысленности не имеет места, поэтому num.MaxValue
выводится именно то, что мы ожидаем, что это будет, давая в FSI
> num.MaxValue;;
val it : int = 2147483647
Наконец, когда вы используете Microsoft.FSharp.Core.int
, вы явно ссылаетесь на объект типа, нет места для двусмысленности, поэтому он работает как ожидалось.
Вернемся к вашему варианту использования с параметром атрибута - в этом контексте int
обрабатывается путем вывода типа как части выражения для доставки значения аргумента, т.е. как функция, если вы явно или косвенно не устанавливаете другую интерпретацию.