如何为整个项目启用 C# 8.0 的 Nullable Reference Types 特性

How to enable Nullable Reference Types feature of C# 8.0 for the whole project

根据 C# 8 announcement video,可以为整个项目启用 "nullable reference types" 功能。

但是如何为项目启用它呢?我在 Visual Studio 2019 Preview 1.

的项目属性 window 中没有找到任何新的合适选项

'legacy'.csproj个项目如果C#语言版本改为8.0可以启用吗?

对于 Visual Studio 2019 预览 2 和 3,请参阅

Visual Studio 2019 的解决方案预览 1:

要为 .NET Core 项目启用可空引用类型功能,请将 NullableReferenceTypes 属性 添加到 .csproj 文件中,如下所示:

<PropertyGroup>
  ...
  <NullableReferenceTypes>true</NullableReferenceTypes>
  <LangVersion>8.0</LangVersion>
</PropertyGroup>

正如@JulienCouvreur 在关于 https://github.com/dotnet/project-system/issues/4058 的评论中提到的,'old' 项目系统尚不支持新的 属性,但会在 C# 8.0 发布之前支持。

请注意,此设置在 VS 2019 预览版 1 和预览版 2 之间发生了变化。对于预览版 2 或 3,您需要在 .csproj:

<PropertyGroup>
  <LangVersion>8.0</LangVersion>
  <NullableContextOptions>enable</NullableContextOptions>
</PropertyGroup>

前面的答案中提到的 <NullableReferenceTypes>(当我最初在 2019 年 2 月 4 日写这个答案时,它已被标记为已接受的答案)在写答案时是正确的,但是它不再被识别。

在 Visual Studio 16.2(来自预览版 1)中,属性 名称更改为 Nullable,这更简单并且与命令行参数一致。

将以下属性添加到您的 .csproj 文件。

<PropertyGroup>
  <Nullable>enable</Nullable>
  <LangVersion>8.0</LangVersion>
</PropertyGroup>

如果您的目标是 netcoreapp3.0 或更高版本,则无需指定 LangVersion 即可启用可为 null 的引用类型。


对于旧的 Visual Studio 版本:

  • 从 16.0 预览版 2 到 16.1,将 NullableContextOptions 设置为 enable
  • 在 16.0 预览版 1 中,将 NullableReferenceTypes 设置为 true

旧版 csproj 格式

您询问了旧版 .csproj 格式。在文本编辑器中打开项目文件并进行以下更改:

  1. Add/change <LangVersion>8.0</LangVersion>DebugRelease PropertyGroup 部分:

     <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
        <LangVersion>preview</LangVersion>
    
  2. 通过将 <Nullable>enable</Nullable> 添加到主 PropertyGroup:

    来启用对可空引用类型的支持
     <PropertyGroup>
        <Nullable>enable</Nullable>
    

在 Visual Studio 2019 v16.2.0 预览版 3 中使用 C# 8 和可空引用类型语法对 .NET WinForms 应用程序进行了测试。


SDK-style 项目文件

SDK 风格的项目要简单得多,并且可以在 Visual Studio 内进行编辑。对于这些,您只需要(在与 TargetFrameworkTargetFrameworks 相同的 PropertyGroup 中):

  <PropertyGroup>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
  </PropertyGroup>

备注

  • .NET Core 3.x 项目以 C# 8 by default 为目标,因此您无需为这些项目指定 LangVersion

  • .NET Framework 项目的默认版本是 C# 7.3,即使使用 <LangVersion>latest</LangVersion> 也不会获得 C# 8.0。您必须将语言版本明确设置为 8.0。详情请参考我对问题的回答。

除了@DrewNoakes 接受的答案外,请注意可以为所有项目一次设置可为空的属性,方法是添加一个名为Directory.Build.props的文件在包含您的 .sln 文件的文件夹中。

只需像这样定义您的 Directory.Build.props 文件:

<Project>

  <PropertyGroup>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

您需要重新启动 Visual Studio 才能生效。

更多关于 Directory.Build.props

值得注意的是,到目前为止,这也是项目属性页面中的公开设置:

至少在 VS2019 16.6+.