Почему Console.Readline не работает, а Console.Readline () работает? - PullRequest
10 голосов
/ 04 июня 2009

Как вы используете Console.Readline в F #? В отличие от Console.Writeline, когда я его называю, это не соблюдается.

Ответы [ 4 ]

29 голосов
/ 04 июня 2009

Если вы используете

let s = Console.ReadLine

вы только строите делегат, который указывает на функцию ReadLine. Вы должны сказать

let s = Console.ReadLine()

чтобы фактически выполнить функцию. Это похоже на синтаксис C #, за исключением того, что вывод типа означает, что вы не получите предупреждение компилятора.

8 голосов
/ 04 июня 2009

Что вы подразумеваете под "это не почитается"? Вот небольшое консольное приложение, которое я только что написал в VS2010b1, и оно отлично работает:

open System

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

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

Вы пытаетесь запустить код из F # Interactive в Visual Studio? Если это так, то это может быть проблемой, как объясняет пост Брайана.

Однако я не видел такой же проблемы при использовании F # Interactive из командной строки. Вот полная стенограмма сеанса:

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 fsbugs@microsoft.com
For help type #help;;

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

val line : string = "Hello world"

Выполнение зацикленного кода Брайана из F # Interactive не показывало ту же проблему.

Итог: Кажется, что это не работает в F # Interactive в Visual Studio, но не при интерактивном запуске из командной строки или в полном консольном приложении.

3 голосов
/ 04 июня 2009

У меня нет удобного окна Beta1, но я знаю, что в прошлом у нас была ошибка, когда ReadLine () видела фоновые команды, которые взаимодействуют между интерактивным пользовательским интерфейсом и фоновым процессом, выполняющим ваш код F # , Может быть интересно выяснить, что

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

печатается, когда вы выделите его и «Отправить в интерактив». Я думаю, возможно, вы увидите несколько неожиданных интересных строк, за которыми следуют строки, которые вы вводите в окно.

0 голосов
/ 05 февраля 2019

// правильный путь, если вы не хотите использовать возврат чего-либо, введенного в readline

Console.ReadLine () |> игнорировать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...