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

147
根据C# 8发布视频中的内容,“可空引用类型”功能可以为整个项目启用。
但是如何为项目启用此功能呢?我在Visual Studio 2019 Preview 1的项目属性窗口中没有找到任何新的适当选项。
如果将C#语言版本更改为8.0,它是否可以为“传统”的.csproj项目启用?
6个回答

179

要为项目中的所有代码启用可空引用类型,请将以下内容添加到其.csproj文件中:

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

或者打开项目属性用户界面,搜索nullable并选择您想要的选项:

enter image description here


要在解决方案中的所有项目中启用此功能,请将该属性添加到Directory.Build.props文件中。您可以使用这样的文件来指定跨多个项目的其他属性。


如果你的目标是早于 netcoreapp3.0 版本的 .NET 版本,你还需要将 LangVersion 设置为 8 或更高,因为可空引用类型是在 C# 8 中添加的。
<PropertyGroup>
  <Nullable>enable</Nullable>
  <LangVersion>8.0</LangVersion>
</PropertyGroup>

对于旧版的 Visual Studio:

  • 您必须使用至少 VS 16.0 版本
  • 在 16.0 预览版 1 中,将 NullableReferenceTypes 设置为 true
  • 从 16.0 预览版 2 到 16.1,将 NullableContextOptions 设置为 enable
  • 从 16.2 预览版 1 开始,使用上述的 Nullable

9
请注意,布尔逻辑可能有点不直观:enable 表示“启用新的 C# 8.0 设置,使类型默认为非空”。disable 表示“以旧有方式处理,即每种类型都可为空。” - Ryan Lundy
3
在旧的非-SDK项目中,即使它们已通过VS 16.3 RTM的属性GUI正确升级到框架4.8,但在<Nullable>生效之前,我还必须将<Project ToolsVersion="16.0" ...>和<VisualStudioVersion ...>从旧的“15,0”更新为“16.0”。只有C#8语言版本会被尊重,而无需进行任何其他项目文件编辑。 - Tony Wall
1
@TonyWall 我很好奇你为什么需要那个。我刚在VS 16.3.7中创建了一个新的.NET Framework控制台应用程序(即非SDK样式项目),将LangVersionNullable属性添加到.csproj中,它可以正常工作。该项目还具有ToolsVersion="15.0" - Drew Noakes
1
@DrewNoakes 不,就像我说的,Nullable 并不总是有效,特别是如果你使用最佳实践,如新的 Code Analysis NuGet 包和最高警告级别/将警告视为错误(也许你错过了一些警告/消息,并没有注意到问题仍然存在)。 - Tony Wall
1
@PaulMcCarthy 据我所知,没有这样的功能。我能想到的最好的办法是确保你在只有那些你希望应用的文件中设置可为空指令。 - Drew Noakes
显示剩余7条评论

36

请注意,此设置在 VS 2019 预览版 1 和预览版 2 之间已更改。在预览版 2 或 3 中,您需要在 .csproj 文件中添加以下内容:

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

在早期答案中提到的<NullableReferenceTypes>(当我在2019年2月4日撰写此答案时,已被标记为被接受的答案)是正确的,但它现在不再被认可。


有关此选项可用值的更多信息(enabledisablesafeonly等):https://github.com/dotnet/roslyn/blob/master/docs/features/nullable-reference-types.md#setting-project-level-nullable-context - Sergey V
8
最近的版本有更改吗?在预览版4.2中,这似乎对我无效。 - waldrumpus
9
自 Visual Studio 6.2 版本起,<NullableContextOptions> 已经被简化为 <Nullable>(请参考已接受的答案)。 - Andrew Hill

31
除了 @DrewNoakes 所接受的答案之外,需要注意的是可以通过在包含 .sln 文件的文件夹中添加名为 Directory.Build.props 的文件来为所有项目同时设置可空属性。

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

<Project>

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

</Project>

为使更改生效,您需要重新启动 Visual Studio。

有关Directory.Build.props的更多信息。


24
值得注意的是,现在这也是项目属性页面中一个公开的设置:"Build" tab shows "Nullable" setting至少在VS2019 16.6+中是如此。

6
不适用于旧版的csproj格式。 - AyCe
4
我看不到那个选项。 - AgentFire
这个 UI 仅在 VS 2019 中可用。它在 VS 2022 中更改为我回答中所示的那个。 - Drew Noakes

15
对于Visual Studio 2019的预览版2和3,请参阅Ian Griffiths的答案
Visual Studio 2019预览版1的解决方案:
要为.NET Core项目启用可空引用类型功能,请像这样向.csproj文件添加NullableReferenceTypes属性:
<PropertyGroup>
  ...
  <NullableReferenceTypes>true</NullableReferenceTypes>
  <LangVersion>8.0</LangVersion>
</PropertyGroup>

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

你尝试过将目标框架更改为 net472 吗?顺便问一下,你是在哪里找到这个设置的呢?那个参考资料会非常有用。我发现很多东西在视频中展示的并不完全适用。 - Panagiotis Kanavos
@PanagiotisKanavos,这个标签是由Mads Torgersen在YouTube的评论中提出的-他是我在原始问题中链接的视频的作者。 - Sergey V
1
此属性尚未在“旧”项目中得到支持。问题已由https://github.com/dotnet/project-system/issues/4058跟踪。 - Julien Couvreur
仍然没有发生任何事情。 - AgentFire

10

传统 csproj 格式

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

  1. Add/change <LangVersion>8.0</LangVersion> in the Debug and Release PropertyGroup sections:

     <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
        <LangVersion>preview</LangVersion>
    
  2. Enable support for nullable reference types by adding <Nullable>enable</Nullable> to the main PropertyGroup:

     <PropertyGroup>
        <Nullable>enable</Nullable>
    

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


SDK风格的项目文件

SDK风格的项目更加简单,可以在Visual Studio中进行编辑。对于这些项目,您所需要的是(在同一个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?”


还是没有。 - AgentFire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接