Why doesn't Console.Readline work but Console.Readline() does?

If you use

let s = Console.ReadLine

you are only building a delegate that points to the ReadLine function. You need to say

let s = Console.ReadLine()

to actually execute the function. This is just like C# syntax, except type inference means you don't get a compiler warning.


What do you mean by "it isn't being honored"? Here's a small console app I've just written in VS2010b1, and it works fine:

open System

let line = Console.ReadLine()
Console.WriteLine("You wrote {0}", line)

// Just to make it pause
let unused = Console.ReadLine()

Are you trying to run the code from F# Interactive within Visual Studio? If so, that may be the issue, as Brian's post explains.

However, I haven't seen the same problem when using F# Interactive from the command line. Here's a complete transcript of a session:

Microsoft F# Interactive, (c) Microsoft Corporation, All Rights Reserved
F# Version 1.9.6.16, compiling for .NET Framework Version v4.0.20506

Please send bug reports to [email protected]
For help type #help;;

> open System;;
> let line = Console.ReadLine();;
Hello world

val line : string = "Hello world"

Running Brian's looping code from F# Interactive didn't show the same problem.

Bottom line: It seems like this is broken in F# Interactive in Visual Studio, but not when running interactively from the command line or in a full console app.


I don't have a Beta1 box handy, but I know that in the past we've had a bug where ReadLine() would see the background commands that communicate between the interactive UI and the background process that runs your F# code. It may be interesting to investigate what

let Foo max =
    let rec Loop i =
        if i < max then
            let line = System.Console.ReadLine() 
            printfn "line = %s" line
            Loop (i+1)
    Loop 1

Foo 12

prints when you highlight it and 'Send to Interactive'. I think possibly you'll see a few unexpected interesting lines, followed by lines you type into the window.

Tags:

F#

Console