FS0008: Obestämd körningstvång

Det här meddelandet ges när ett typtestmönster används för att matcha ett värde, men gjutningen kan inte bevisas på ett säkert sätt vid kompileringstillfället eftersom typvärdet inte har fastställts av kompilatorn. Detta inträffar ofta vid matchning på en funktionsparameter vars typ har härledts. Följande kod illustrerar ett exempel på detta:

let unboxAndPrint x = 
    match x with
    | :? string as s -> printfn "%s" s
    | _ -> printfn "not a string"

Den här koden resulterar i följande utdata:

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.

I den här koden har funktionsparametern x inte haft någon härledd typ. Detta kan vara av valfritt antal orsaker, allt från parametern som inte används på sätt som ger typinferensalgoritmen all information, till att funktionen inte anropas någon annanstans i koden. Eftersom typen av x inte har härledts kan kompilatorn inte garantera att typen av x kan gjutas som en sträng. Eftersom kompilatorn inte kan garantera att den här casten kan utföras vid körningen, ger den det här meddelandet.

För att åtgärda det här meddelandet måste du ge kompilatorn mer information om vilken typ av värde du använder typtestmönstret för.

Ett sätt att åtgärda koden ovan är att tillämpa en typ på parametern x direkt:

let unboxAndPrint (x: obj) = 
    match x with
    | :? string as s -> printfn "%s" s
    | _ -> printfn "not a string"

I den här koden får parametern x en typ av obj, och eftersom obj kan typtestas för att se om den underliggande representationen är stringkompileras funktionen nu.

Ett annat sätt att åtgärda den felaktiga koden är att använda ett annat sätt att konvertera parametern x till :string

let unboxAndPrint x = 
    printfn "%s" (string x)

I den här koden har användningen av string funktionen på parametern x gett kompilatorn tillräckligt med information för att härleda typen av x som string, så att felet löses genom att funktionen omstruktureras.