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.
解决此问题的三个选项。
“我知道得更多”。在编译器 认为 可能为空的东西之后使用“空宽恕”运算符 (!
) 以强制它像往常一样对待它 not-null.
string a = sentence.First!.Value;
“检查一下”。事先做一个简单的空检查。
if (sentence.First is not null)
string a = sentence.First.Value;
禁用可为 null 的引用类型功能。我真的不推荐这个。
此外,一般警告:所有这些都是编译时检查。当程序为 运行 时,它对 null checking/enforcement 没有权力。标记为“non-nullable”的变量可以在程序运行时设置为空。
我正在尝试学习 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.
解决此问题的三个选项。
“我知道得更多”。在编译器 认为 可能为空的东西之后使用“空宽恕”运算符 (
!
) 以强制它像往常一样对待它 not-null.string a = sentence.First!.Value;
“检查一下”。事先做一个简单的空检查。
if (sentence.First is not null) string a = sentence.First.Value;
禁用可为 null 的引用类型功能。我真的不推荐这个。
此外,一般警告:所有这些都是编译时检查。当程序为 运行 时,它对 null checking/enforcement 没有权力。标记为“non-nullable”的变量可以在程序运行时设置为空。