【问题标题】:Converting null literal for Console.ReadLine() for string input将 Console.ReadLine() 的 null 文字转换为字符串输入
【发布时间】:2022-01-14 08:45:15
【问题描述】:

我是 c# 新手,所以我需要一些指导。

string NumInput = Console.ReadLine();

在我的代码中,这条语句给出了警告

将 null 文字或可能的 null 值转换为不可为 null 的类型。

是否有任何替代此代码行或任何可以使此警告消失的方法

【问题讨论】:

  • string 更改为string?var
  • 或者在文件中添加#nullable disable
  • 或使用:string NumInput = Console.ReadLine() ?? string.Empty;
  • 为了参考和进一步研究,您收到此错误是因为您在项目中启用了可为空的引用类型:docs.microsoft.com/en-us/dotnet/csharp/nullable-referencesConsole.ReadLine 返回一个可以为空的字符串 (string?),您尝试将其分配给一个不可为空的字符串变量。
  • 为了完整起见,如果标准输入已被重定向,Console.ReadLine() 可以返回 null。例如,您的应用程序可以调用为myapp < input.txt;如果input.txt 为空NumInput 将最终为null,并且如果启用了可空引用,您将需要处理这种情况。当以交互方式使用时,它永远不会返回null,因为在用户输入一行之前应用程序不会继续。

标签: c# .net console-application


【解决方案1】:

首先,您看到此消息是因为您在项目中启用了 C# 8 Nullable reference type 功能。 Console.ReadLine() 返回的值可以是 stringnull,但您使用它来设置 string 类型的变量。取而代之的是使用var 关键字,该关键字将隐式将您的变量设置为与返回值相同的类型,或者手动将您的变量设置为类型可空字符串 string?? 表示可以为空的引用类型。

然后,您可能想在使用之前检查您的变量是否确实包含一个字符串:

string? NumInput = Console.ReadLine();
if (NumInput == null)
{
    // ...
}

【讨论】:

  • 虽然您的解释是合理的,但建议的代码却不是。 Console.ReadLine() 只会返回 null 如果重定向输入已经到达输入的结尾,如果已经到达,再次读取它只会让你再次得到 null,所以这变成了一个无限循环。在交互式设置中,如果用户不输入任何内容(只需按 Enter),它将返回一个空字符串,而不是 null。因此,仅仅重复操作是没有意义的。
  • @JeroenMostert 啊对!感谢您的解释。我将调整我的答案以删除该部分。无论如何,这与问题无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2023-01-28
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多