为什么Console.Readline不起作用但是Console.Readline()呢?

Jon*_*len 10 console f#

你如何在F#中使用Console.Readline?与Console.Writeline不同,我打电话时它并没有被尊重.

Jon*_*len 29

如果你使用

let s = Console.ReadLine
Run Code Online (Sandbox Code Playgroud)

您只构建一个指向ReadLine函数的委托.你需要说

let s = Console.ReadLine()
Run Code Online (Sandbox Code Playgroud)

实际执行该功能.这就像C#语法一样,除了类型推断意味着你没有得到编译器警告.

  • 对.Console.ReadLine是一个"unit - > string"值.通过添加(),您将传递它期望作为参数的"单位". (3认同)
  • 你会得到编译器警告!当你使用**s**.听起来你打算写'Console.ReadLine()|> ignore`.我认为C#不会检查函数的输出是被捕获还是被忽略. (2认同)

Jon*_*eet 8

你是什​​么意思"它没有被尊重"?这是我刚刚在VS2010b1中编写的一个小型控制台应用程序,它运行正常:

open System

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

// Just to make it pause
let unused = Console.ReadLine()
Run Code Online (Sandbox Code Playgroud)

您是否尝试在Visual Studio中运行F#Interactive的代码?如果是这样,那可能就是问题,正如Brian的帖子所解释的那样.

但是,从命令行使用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"
Run Code Online (Sandbox Code Playgroud)

从F#Interactive运行Brian的循环代码没有显示同样的问题.

结论:在Visual Studio中的F#Interactive中似乎已经破坏了这一点,但在从命令行或完整控制台应用程序中以交互方式运行时却没有.

  • "let unused = Console.ReadLine()"将更像F#惯用,因为"Console.ReadLine()|> ignore" - 这消除了对无用'let'语句的需要并处理忽略返回值. (2认同)