如何为整个项目启用 C # 8.0的可空引用类型特性

根据 C # 8公告视频,“可空引用类型”特性可以为整个项目启用。

但是如何为项目启用它呢?在 VisualStudio2019Preview 1的“项目属性”窗口中,我没有找到任何新的合适选项。

如果 C # 语言版本更改为8.0,是否可以为“遗留”.csproj项目启用?

77864 次浏览

有关 VisualStudio2019预览2 & 3,请参见 Ian Griffiths 的回答

VisualStudio2019 预览1 解决方案:

若要为.NET Core 项目启用 Nullable Reference Types 特性,请向 .csproj文件中添加 NullableReferenceTypes属性,如下所示:

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

正如@JulienCouvreur 在关于 https://github.com/dotnet/project-system/issues/4058的评论中提到的那样,新属性在“旧”项目系统中还不支持,但在 C # 8.0发布之前将得到支持。

请注意,此设置在 VS2019预览版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来启用可为空的引用类型。


或者,如果你喜欢使用 GUI,打开 ProjectProperties UI,搜索 无效并选择你想要的选项:

enter image description here


对于较旧的 VisualStudio 版本:

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

遗留的 csproj 格式

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

  1. DebugRelease PropertyGroup 部分添加/更改 <LangVersion>8.0</LangVersion>:

     <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <LangVersion>preview</LangVersion>
    
  2. 通过将 <Nullable>enable</Nullable>添加到主 PropertyGroup,支持可空引用类型:

     <PropertyGroup>
    <Nullable>enable</Nullable>
    

测试了一个。NET WinForms 应用程序在 Visual Studio 2019 v16.2.0 Preview 3中使用 C # 8和可空引用类型语法。


SDK 风格的项目文件

SDK 样式的项目要简单得多,并且可以在 VisualStudio 中编辑。对于这些你所需要的是(在相同的 PropertyGroup作为 TargetFrameworkTargetFrameworks) :

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

笔记

  • NET Core 3.x 项目的目标是 C # 8 默认情况下,因此不需要为这些项目指定 LangVersion

  • 的默认值。NET Framework 项目是 C # 7.3,即使使用 <LangVersion>latest</LangVersion>也得不到 C # 8.0。必须显式地将语言版本设置为8.0。详情请参阅我对问题 C # 8支持.NET Framework 吗?的回答。

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

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

<Project>


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


</Project>

需要重新启动 VisualStudio 才能生效。

更多关于 Directory.Build.props的资料。

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

"Build" tab shows "Nullable" setting

至少在 VS2019中是16.6 + 。