Я согласен с @James, что это связано с ошибкой, представленной в Connect, но я думаю, что это немного другой случай. Во всяком случае, я думаю, что это не намеренное поведение. Не могли бы вы сообщить об этом fsbugs в microsoft dot com ?
В любом случае - я сделал некоторую отладку, и вот что я нашел до сих пор:
Похоже, что компилятор использует разные пути кода для разрешения имени Action
и имени System.Action
. При разрешении другого он ищет во всех загруженных модулях (то есть сборках) тип с именем System.Action
(см. Функцию ResolveLongIndentAsModuleOrNamespaceThen
в файле nameres.fs
выпуска с открытым исходным кодом).
Находит два определения Action
(одно в mscorlib
и другое в System.Core
). Я думаю, что проблема связана с тем фактом, что разрешение имени просто перебирает результаты - оно находит первое (от System.Core
), которое не имеет полезной перегрузки (потому что оно варьируется от Action<_,_,_,_,_>
до версии с около 15 параметров типа). Найдя этот тип, он сообщает об ошибке, даже не глядя, есть ли другой тип (в другой сборке), который может быть использован.
Если вы не ссылаетесь на системные сборки, то компилятор F # разрешает перегрузку просто отлично. Запуск компилятора без параметров ссылается на набор сборок по умолчанию, поэтому это не работает:
fsc test.fs
но если я добавлю флаг --noframework
, он будет скомпилирован без проблем:
fsc --noframework test.fs