C# StreamReader.Readline() 在 while 循环中给我可为空到不可为空的警告

问题描述 投票:0回答:2

所以我的问题是我收到来自视觉工作室的警告

“空文字或可能的空值到不可空类型”

代码可以正常工作并按预期执行,但是我仍然收到此警告,并且我不确定如何解决该问题。

我一开始就将

StreamReader
声明为
private
属性。如果有人能给我指明方向或建议改进以防止出现此警告,我将不胜感激,我已在下面附上相关代码:

private StreamReader? streamReader;
public Form1()
        {
            InitializeComponent();

            CreateFiles();
            ReadFiles();
        }

private void ReadFiles()
    {
        streamReader = File.OpenText(path + _productTypeFile);
        string line = "";
        if (streamReader == null)
        {
            throw new Exception("An error occured with stream reader");
        }
        while ((line = streamReader.ReadLine()) != null)
        {
            currentProdTypeListBox.Items.Add(line);
        }
        if (streamReader.ReadLine() == null) streamReader.Close();
    }

下面的行是警告的来源:

while ((line = streamReader.ReadLine()) != null)
c# file streamreader nullable-reference-types
2个回答
0
投票

将函数更改为:

private void ReadFiles()
{
   string path = "your path";
   using StreamReader streamReader = File.OpenText(path );

   if (streamReader == null)
      throw new Exception("An error occured with stream reader");
   var line = "";
   while (( line = streamReader.ReadLine()) != null)
   {
    currentProdTypeListBox.Items.Add(line);
   }
   streamReader.Close();
}

0
投票

查看 C# 语言参考的 nullable warnings 页面。

CS8600
链接到“分配给不可为空引用的可能为空”部分,该部分解释了“当您尝试将可能为空的表达式分配给不可为空的变量时,编译器会发出这些警告”并详细说明了您要执行的操作可以采取措施解决这些警告。 例如,您可以通过添加 ? 注释使变量成为可为空的引用类型,例如:

string line? = "";

但是,这会将其默认的 

null-state
not-null

更改为 maybe-null,在您的示例中这可能不是问题,但如果该变量使用更广泛,编译器的静态分析可能会发现您取消引用“可能为空”的变量的实例。 此外,如果您打算采用这种方法,我建议您使用 string.Empty field 而不是 ""

magic string

,例如: string line? = string.Empty;

另一种方法,正如 Nima Habibollahi 在他们的答案中建议的那样是使用 

var
,例如:

var line = string.Empty; 使用

var
将默认的

null-state
 设置为 
maybe-null

。使用显式定义为可为空字符串的变量与隐式定义为字符串的变量取决于个人偏好

IMHO
最后,解决警告的另一种方法是向 ! 调用添加 null 宽容运算符 ReadLine(),例如:

string line = ""; while ((line = streamReader.ReadLine()!) != null)

可空警告
页面中提供的其他建议与您的代码无关,因为您无法指示编译器赋值的右侧是

not-null
,因为您正在测试的是
null

for,所以强制它为 not-null 会破坏你的代码。


© www.soinside.com 2019 - 2024. All rights reserved.