c# - 后缀!C# 中的(感叹号)运算符
问题描述
最后一天,我在 GitHub 上探索 .NET 源代码,偶然发现了以下结构:((SomeTypeToCast)variable!).SomeMethodToCall()
.
请注意后缀!最初在这里列出
所以,一个简单的问题:这是什么?
PS:就我个人而言,我对这件事的含义有几个猜测:有点“这个值永远不会为空”。但是,C# 中没有这样的运算符(至少公开可用),并且当我自己在测试项目中尝试它时,这样的表达式无法编译。
解决方案
这是 C# 8 中的null-forgiving运算符(也称为“damn-it”运算符),它有效地告诉编译器假设该值将是非 null 的。它有点像演员表,告诉编译器你比它更了解 - 但它在执行时没有影响,所以你有效地绕过了编译器检查的安全性。
它是作为C# 8 可空引用类型特性的一部分引入的。它在 .NET Core 3.0 SDK 的公共预览版本中可用。
我的经验中的典型用途:
- 测试您的参数验证代码,以证明如果您确实将 null 传递给一个方法,那么您就可以抛出验证
ArgumentNullException
- 由于编译器不知道的其他不变量,您确定该值不会为空的地方。(例如,在 Noda Time 中,我有一个
ParseResult<T>
包含值字段和异常提供程序的字段。异常提供程序为 null 或值为 null,但绝不是两者,而且我总是在使用该值之前检查异常提供程序。)
推荐阅读
- postgresql - 使用连接中的子查询简化聚合查询
- wcf - 在 .Net Core 2.2 Web API 中添加 WCF 参考失败
- android - 无法在 PermissionHandler 中禁用相机权限
- forms - /?#/ 在带有 Vue-router 的 Vue 中是什么意思?
- python - 为赛道添加积分
- javascript - 从 ssr 上的 url 参数中获取带有 id 的数据
- bash - docker-compose 启动时的 pv 输出未按预期工作
- r - 为什么 do.call 函数在这种情况下会出错?
- lua - 是什么让 Lua 表的键顺序不确定?
- mips - 时钟周期和 R 型命令执行时间