C# LinkedList:可能出现空引用错误?

C# LinkedList: Possible null reference error?

我正在尝试学习 C# 的一些基础知识(对一般编程来说并不陌生),但我在使 LinkedList 的某些代码正常工作时遇到了问题。具体来说,当我将一个值从 LinkedList 分配给 LinkedListNode 变量时,我得到了一个“可能的空引用”错误——这是不可能的吗?我从网站 (https://dev.to/adavidoaiei/fundamental-data-structures-and-algorithms-in-c-4ocf) 上获得了代码,所以我觉得代码完全错误似乎很奇怪。

这是导致问题的代码部分:

    // Create the linked list
    string[] words = 
        { "the", "fox", "jumps", "over", "the", "dog" };
    LinkedList<string> sentence = new LinkedList<string>(words);
    Display(sentence, "The linked list values:");
    Console.WriteLine("sentence.Contains(\"jumps\") = {0}",
        sentence.Contains("jumps"));

    // Add the word 'today' to the beginning of the linked list
    sentence.AddFirst("today");
    Display(sentence, "Test 1: Add 'today' to beginning of the list:");

    // Move the first node to be the last node
    LinkedListNode<string> mark1 = sentence.First;
    sentence.RemoveFirst();
    sentence.AddLast(mark1);
    Display(sentence, "Test 2: Move first node to be last node:");

初始化变量 'mark1' 时,出现“可能的空引用错误”:

LinkedListNode<string> mark1 = sentence.First;

我正在尝试做的事情是否完全可行,或者这是使用 LinkedList 的完全错误的方式?

看看ListedList<T>.First property的签名:

public System.Collections.Generic.LinkedListNode<T>? First { get; }

看到那个问号了吗?这意味着值 可以 为 null。

您收到的警告(是警告,不是错误)告诉您,当您阅读 First 属性 时,它 可能 有一个空值,而您 可以 将一个空值分配给 不应该 分配一个空值的东西。

现在,不幸的是,当前的 c# 编译器不够智能,无法识别像这样的东西 null 举个例子:

LinkedList<string> sentence = new LinkedList<string>();
sentence.AddFirst("today");
string a = sentence.First.Value;
// last line will have a warning for "sentence.First" possibly being null.

解决此问题的三个选项。

  1. “我知道得更多”。在编译器 认为 可能为空的东西之后使用“空宽恕”运算符 (!) 以强制它像往常一样对待它 not-null.

    string a = sentence.First!.Value;
    
  2. “检查一下”。事先做一个简单的空检查。

    if (sentence.First is not null)
        string a = sentence.First.Value;
    
  3. 禁用可为 null 的引用类型功能。我真的不推荐这个。


此外,一般警告:所有这些都是编译时检查。当程序为 运行 时,它对 null checking/enforcement 没有权力。标记为“non-nullable”的变量可以在程序运行时设置为空。