2010-03-08 2 views
5

Когда я попробовал консольное программирование, я получил неожиданный результат.Является ли это ошибкой F # Builder или моим недоразумением?

open System 

let printSomeMessage =   
    printfn "Is this the F# BUG?"  

[<EntryPoint>] 
let main args =  
    if args.Length = 2 then 
     printSomeMessage 
    else   
     printfn "Args.Length is not two." 
    0 

Функция printSomeMessage была включена в функцию .cctor(). Вот результат IL DASM.

.method private specialname rtspecialname static 
     void .cctor() cil managed 
{ 
    // Code size  24 (0x18) 
    .maxstack 4 
    IL_0000: nop 
    IL_0001: ldstr  "Is this the F# BUG\?" 
    IL_0006: newobj  instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5<class [FSharp.Core]Microsoft.FSharp.Core.Unit,class [mscorlib]System.IO.TextWriter,class [FSharp.Core]Microsoft.FSharp.Core.Unit,class [FSharp.Core]Microsoft.FSharp.Core.Unit,class [FSharp.Core]Microsoft.FSharp.Core.Unit>::.ctor(string) 
    IL_000b: call  !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine<class [FSharp.Core]Microsoft.FSharp.Core.Unit>(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4<!!0,class [mscorlib]System.IO.TextWriter,class [FSharp.Core]Microsoft.FSharp.Core.Unit,class [FSharp.Core]Microsoft.FSharp.Core.Unit>) 
    IL_0010: dup 
    IL_0011: stsfld  class [FSharp.Core]Microsoft.FSharp.Core.Unit '<StartupCode$FSharpBugTest>'.$Program::[email protected] 
    IL_0016: pop 
    IL_0017: ret 
} // end of method $Program::.cctor 

Итак, результат его выполнения выглядит следующим образом.

Я пропустил какую-либо грамматику или характеристику F #? Или BUG BUG?

ответ

10

Нет, это ошибка в коде. Вам нужно добавить круглые скобки после «printSomeMessage», иначе printSomeMessage - это простое значение, а не функция.

open System 

let printSomeMessage() =   
    printfn "Is this the F# BUG?"  

[<EntryPoint>] 
let main args =  
    if args.Length = 2 then 
     printSomeMessage() 
    else   
     printfn "Args.Length is not two." 
    0 

Простые значения инициализируются в конструкторе модуля, так что вы видите ваш код вызывается, когда модуль инициализации. Это логично, когда вы думаете об этом, нормальный случай простых значений будет привязывать к идентификатору значение string, integer или другое литерал. Вы бы, если бы это случилось, началось. т. е. при запуске модуля будут связаны следующие:

+0

Очевидно, я мог бы понять! Спасибо! – 2010-03-08 12:49:03

+0

Без проблем, рад, что мой ответ помог. – Robert

+0

Очистить как день, хороший ответ! –

Смежные вопросы