V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wuliiqq
V2EX  ›  C#

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

  •  
  •   wuliiqq · 2020-06-14 01:11:46 +08:00 · 4503 次点击
    这是一个创建于 1384 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    class LinkedList<Anytype> {

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

    }

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

    2 条回复    2020-09-17 07:19:40 +08:00
    forgottencoast
        1
    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
        2
    bbsabc2  
       2020-09-17 07:19:40 +08:00
    空集合 的 First 方法一般 会抛出异常,

    没有异常的版本使用 FirstOrDefault 方法
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1029 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 22:22 · PVG 06:22 · LAX 15:22 · JFK 18:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.