问题描述
因为我从未编写过控制台应用程序,所以我认为现在开始是个好主意。如果仅仅是因为我发现Visual Studio相当迟缓,并且能够在某个游乐场(如dotnetfiddle)上快速测试代码的想法似乎很有吸引力。net上的默认编译器是.NET4.7.2,但我注意到那个编译器被我借用的较新代码卡住了。因此,我习惯了这样一个事实,即我必须将编译器切换到.NET5,以便能够利用诸如$这样的细微之处来格式化文本。
TL;DR
但是,我发现在https://dotnetfiddle.net/tAJulh上的示例中找到的简单ReadLine()
如果您将编译器更改为.NET5,ReadLine()
就不起作用了。.NET5中的ReadLine规范有什么变化吗,还是这是dotnetfiddle的限制?有什么办法可以绕过这个问题吗?
using System;
public class Program
{
public static void Main()
{
// Simply writes the following text to the standard output
Console.WriteLine("Input some text!");
// Reads text until you hit "enter"; and saves it to the "input"-variable
var input = Console.ReadLine();
// Writes the "input"-variable to the console.
Console.WriteLine("Your input was: " + input);
// The program will not exit until you hit "Enter".
Console.ReadLine();
}
}
推荐答案
我可以确认,dotnetfiddle和我们的.NET核心实现目前不支持Console.ReadLine
。原因是我们使用沙箱,因为我们在执行用户代码时需要安全。对于.NET5,我们使用docker,而对于普通的.NET4.7.2Roslyn,我们使用AppDomain。在docker情况下,我们只是编译代码并按原样执行。在AppDomain案例中,我们通过在用户代码之上插入自己的代码来限制它。
由于这些方式不同,因此每种方式都可能有一些限制。ReadLine的问题是,当用户运行自己的代码时,我们需要部分执行它,然后注入到Console.In
流中,如果从流中请求了什么,那么我们就停止执行并要求用户提供输入,然后在提供输入之后,我们需要再次重新启动执行,并使用Console.In
中的用户输入,反复重复,直到代码完全执行。为AppDomain注入它要容易得多,所以它在.NET 4.7.2中工作得很好,但在docker中很难做到,因为我们没有在那里注入自己的代码,所以目前还缺少这个功能。
这篇关于C#控制台应用程序ReadLine()可以在.NET 4.7.2中使用,而不能在.NET 5中使用(在dotnetfiddle上)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!