大发龙虎 = way to explore
大发龙虎 是一个大发龙虎关于 分享和探索的地方
现在注册
已注册用户请  登录
牛客网
wuliiqq
大发龙虎  ›  C#

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

  •  
  •   wuliiqq · 135 天前 · 1687 次点击
    这是一个创建于 135 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题 初学 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   135 天前
    这句“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   40 天前
    空集合 的 First 大发龙虎方法 一般 会抛出异常,

    没有异常的版本使用 FirstOrDefault 大发龙虎方法
    大发龙虎关于   ·   FAQ   ·   API   ·   大发龙虎大发龙虎我 们 的愿景   ·   广告投放   ·   感谢   ·   实用小大发龙虎工具   ·   2584 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 15:28 · PVG 23:28 · LAX 08:28 · JFK 11:28
    ♥ Do have faith in what you're doing.