C#NULL 检查运算符(?.)和泛型

2020-06-14 01:11:46 +08:00
 wuliiqq

如题 初学 c#语言,想用 C#语言实现一个泛型类型单链表 有如下代码:

class LinkedList<Anytype> {

public Node<Anytype> Head;

public Anytype getFirst () {
 	return this.Head?.Data;
}

}

在 getFirst 方法中,我使用了?.操作符,出现了如下错误: "运算符“?”无法应用于“Anytype”类型的操作数", 我找不到为什么这里不能使用这个操作符的原因,是因为 Node 是泛型类型的原因吗? 烦请前辈解答。

4736 次点击
所在节点    C#
2 条回复
forgottencoast
2020-06-14 18:14:24 +08:00
这句“return this.Head?.Data;”
等同于“return this.Head == null ? null : Head.Data;”
因为 Anytype 有可能是 struct,而 struct 是不可为 null 的,所以不能在 this.Head == null 成立的分支把 null 作为返回值。
因此,这里不能用?.操作符。
变通的改法是 return this.Head == null ? default(Anytype) : Head.Data;
但是没有节点仍然返回值是不对的,这样无法区分是没有节点还是节点的值是默认值。
所以,.NetFramework 返回的是 LinkedListNode<T>,一个 class,可为空。

另外:指导手册建议不用 Anytype 这种很长的写法,就是 T 。
以及 getFirst,会写出:public LinkedListNode<T> First { get; }
bbsabc2
2020-09-17 07:19:40 +08:00
空集合 的 First 方法一般 会抛出异常,

没有异常的版本使用 FirstOrDefault 方法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/681359

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX