使用 C# 8 的可空引用类型
Posted
技术标签:
【中文标题】使用 C# 8 的可空引用类型【英文标题】:Nullable Reference Types with C# 8 【发布时间】:2018-07-18 18:00:45 【问题描述】:空引用异常是程序失败的主要来源之一。托尼·霍尔称之为他的十亿美元错误。所以我特别期待 C# 8 和新的 可为空的引用类型 功能。我想我已经很好地掌握了这个特性以及它对我的代码意味着什么。不过,有一个方面我正在努力解决问题,这就是default
的行为方式。
目前在 C# 中 default(string)
将返回 null。但是当 C# 8 出现时,像string x = default(string);
这样的操作肯定会立即给出编译器警告。这似乎有点悖论。我还想知道default(string?)
是否可行,它甚至会返回什么。我想它必须是 null 这只会增加我的困惑。
我认为目前还没有此功能的预览版,但我想知道是否有人知道如何处理。
【问题讨论】:
有一个preview。 由于string
将是一个对象,所以default(string)
给予null
非常有意义。
并且this specific question 已被询问和处理。
一般来说 - C# 语言设计是在 github 上“公开”完成的。所以这是搜索此类信息的合乎逻辑的地方。
@HimBromBeere - 如果您选择了可空引用类型功能并将变量声明为不包含空值,则不会。
【参考方案1】:
这个问题现在可以回答,而不是等待 C# 8 发布。 C# 现在是“公开”开发的,所以请自己前往SharpLab,选择NullabaleReferenceTypes
分支并尝试代码。
它给出了warning CS8600: Cannot convert null to non-nullable reference.
,因为default
的引用类型是null
,并且null
不应分配给不可为空的string
。
如果您想在 VS2017 中测试预览,a preview plugin is available for the IDE, too。
【讨论】:
我不知道 SharpLab。这看起来是一个非常有用的工具,超越了其他 dotnet fiddle 网站。以上是关于使用 C# 8 的可空引用类型的主要内容,如果未能解决你的问题,请参考以下文章
.NET Framework 项目中的可空引用类型不能与 IntelliSense 一起使用
如何将 C# 8.0 可空引用类型与 Entity Framework Core 模型一起使用?