使用 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 一起使用

未从 FirstOrDefault 公开的可空引用类型信息

如何将 C# 8.0 可空引用类型与 Entity Framework Core 模型一起使用?

C# 8.0 可空(Nullable)给ASP.NET Core带来的坑

如何将所有 C# 8 可空引用警告视为错误?