首页 > 其他分享 >被Null条件运算符摆了一道

被Null条件运算符摆了一道

时间:2024-01-26 10:57:52浏览次数:26  
标签:null obj await 运算符 一道 InvokeAsync Null

C#6.0引入了Null条件运算符:

obj?.Invoke();

等价于

if(obj != null)
  obj.Invoke();

即遇到null时短路。

于是,我不假思索地写下了这样的代码:①

await obj?.InvokeAsync();

遇到null时短路嘛,我以为是等价于这样:②

if (obj != null)
  await obj.InvokeAsync();

 

于是乎,直到发生异常NullReferenceException的时候,我还信誓旦旦地认为肯定是别的对象为null,这行绝对没问题。因为耽误了一大堆时间。

实际上,在异步调用的情况下,上面那个释义是错误的,这种用法的释义应该是这样:③

await (obj != null ? obj.InvokeAsync() : null)

于是出现了await null这种会产生异常的小窍门。

为了让await成功,null需要修改为Task.FromResult<T>(null);

如果还要用Null条件运算符,最先的调用语句应该修改为:④

await (obj?.InvokeAsync() ?? Task.FromResult<T>(null));

跟我一开始想的②大相径庭了,await null跟await Task.FromResult<T>(null)这都啥呀(ㄒoㄒ)

慎用!

标签:null,obj,await,运算符,一道,InvokeAsync,Null
From: https://www.cnblogs.com/pasoraku/p/17988841

相关文章

  • 每日一道Java面试题:方法重载与方法重写,这把指定让你明明白白!
    写在开头请聊一聊Java中方法的重写和重载?这个问题应该是各大厂面试时问的最多的话题之一了,它们几乎贯穿了我们日常的开发工作,在过往的博客中我们多多少少都提到过重载与重写,而今天我们就一起来详细的学习一下这二者的功能与区别!重载与重写的定义重写:类实现接口或者子类继承......
  • 运算符的关系简览
     C/C++运算符优先级 优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右--()圆括号(表达式)/函数名(形参表)--.成员选择(对象)对象.成员名--->成员选择(指针)对象指......
  • C++教程——初识C++(运算符)
    前一节我们初步认识出c++是一门面向对象的程序设计语言,并且我们初步认识了变量,数据类型,常量,输入输出以及合法的标识符命名规则,接下来我们要学习的是运算符。在c++中有逻辑运算符,赋值运算符,算数运算符,位运算符,关系运算符和杂项运算符。先从简单的算数运算符开始讲起,算数运算符简单来......
  • JS中的扩展运算符(...)和剩余运算符(...)
    一、概念在JS中,扩展运算符(spread)是三个点 (...) ,剩余运算符(rest)也是三个点 (...)二、扩展运算符(1)基本使用:扩展运算符的主要作用是将一个数组转为用逗号分隔的参数序列,它好比rest的逆运算//传递数据代替多个字符串的形式functiontest(a,b,c){console.log(a);//1......
  • Error Code: 1171. All parts of a PRIMARY KEY must be NOT NULL
    今天建表时候发现报错了:CREATETABLEt3(c1intDEFAULTNULL,c2intDEFAULTNULL,c3intNOTNULL,c4intDEFAULTNULL,PRIMARYKEY(c1,c2,c3))ENGINE=InnoDBDEFAULTCHARSET=utf8mb3ErrorCode:1171.AllpartsofaPRIMARYKEYmustbeNOTNULL;ifyounee......
  • OC 中 nullable、__nullable、_Nullable 的区别
    在Objective-C中,nullable、__nullable和_Nullable都是用来表示一个对象可以是nil的注解。它们在不同的上下文中使用,但本质上具有相同的意义。这些注解主要用于与Swift互操作时提供更清晰的API,并帮助开发者更好地处理nil值。以下是它们各自的使用情况和区别:nullablenull......
  • (19)Powershell字符串合并运算符
    (19)Powershell字符串合并运算符Powershell提供了对字符串的合并运算符,连接运算符-join将一组字符串连接成单个字符串,子字符串按其在命令中出现的顺序添加到生成的字符串中。连接运算符Powershell中字符串的连接运算符的语法如下:-Join<String[]><String[]>-Join参数......
  • (18)Powershell中的字符串拆分运算符
    (18)Powershell中的字符串拆分运算符Powershell中提供了对字符串的拆分操作运算符。-split运算符将一个字符串拆分成多个字符串。拆分运算符拆分运算符用于将一个或多个字符串拆分为多个子字符串。可更改拆分操作的以下元素:(1)定界符。默认为空白,但是可指定字符、字符串、模......
  • [整理参考] CMD/DOS下运算符号的作用
    因关于DOS符号的总结很少,所以根据[1],经过几次整理之后,写了下面这个《CMD/DOS符号参考》,推荐新手好好看看,老手温习。标题:[整理参考]CMD/DOS下符号的作用参考作者:lxmxn[at]bbs.cn-dos.net时间:2007-5-27邮箱:lxmxn520[at]163.com说明:1、转帖请注明原帖出处属于中国DOS联盟(www.cn-do......
  • uniapp打包h5在Android的webview中打开出现localStorage.setitem为null的记录
    使用android直接打开h5的链接,报错localStorage.setItem为null原因是要打开Android的webview的存储设置valwebView=findViewById<WebView>(R.id.webview)valsettings=webView.settingssettings.domStorageEnabled=truesettings.datab......