Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это сообщение получается, когда шаблон теста типа используется для сопоставления значения, но приведение не может быть безопасно проверено во время компиляции, так как значение типа не определено компилятором. Это часто происходит при сопоставлении с параметром функции, тип которого был выведен. Следующий код иллюстрирует пример этого:
let unboxAndPrint x =
match x with
| :? string as s -> printfn "%s" s
| _ -> printfn "not a string"
Этот код приводит к следующим выходным данным:
This runtime coercion or type test from type
'a
to
string
involves an indeterminate type based on information prior to this program point. Runtime type tests are not allowed on some types. Further type annotations are needed.
В этом коде параметр x функции не имел типа, выводимого для него. Это может быть по любым причинам, начиная от параметра, который не используется способами, которые предоставляют алгоритм вывода типов любой информации, функции, которая не вызывается нигде в коде. Так как тип не был выведен, компилятор не может гарантировать, что тип xx может быть приведение в виде строки. Так как компилятор не может гарантировать, что этот приведение может выполняться во время выполнения, оно дает это сообщение.
Чтобы исправить это сообщение, необходимо предоставить компилятору дополнительные сведения о типе значения, для которого используется шаблон проверки типа.
Одним из способов исправления приведенного выше кода будет применение типа к x параметру напрямую:
let unboxAndPrint (x: obj) =
match x with
| :? string as s -> printfn "%s" s
| _ -> printfn "not a string"
В этом коде параметр присваивается типуobj, и так как obj он может быть проверен типом, чтобы узнать, x является ли базовое представлениеstring, функция теперь компилируется.
Другим способом исправления ошибочного кода является использование другого способа преобразования x параметра в string:
let unboxAndPrint x =
printfn "%s" (string x)
В этом коде использование string функции в x параметре дало компилятору достаточно сведений, чтобы определить тип x , stringпоэтому ошибка разрешается путем рефакторинга функции.