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

Ser*_*y V 44 c# visual-studio c#-8.0 visual-studio-2019 nullable-reference-types

根据名为"可空引用类型"的新C#8.0功能的声明,可以为整个项目启用它.(这里提到:https://youtu.be/VdC0aoa7ung?t = 137)但是如何为项目启用它?在Visual Studio 2019预览1的"项目属性"窗口中找不到任何新的适当选项.如果C#语言版本更改为8.0,是否可以为"旧".NET Framework项目启用它?

Dre*_*kes 36

在Visual Studio 16.2(预览1)中,属性名称更改Nullable为更简单,并且与命令行参数对齐。

<PropertyGroup>
  ...
  <Nullable>enable</Nullable>
  <LangVersion>8.0</LangVersion>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

请注意,如果您要定位netcoreapp3.0或更高版本,则无需指定LangVersion8,因为这是.NET Core 3中的默认设置。


对于较旧的Visual Studio版本:

  • 从16.0预览2到16.1设置NullableContextOptionsenable
  • 在16.0预览1中设置NullableReferenceTypestrue

  • 请注意,布尔逻辑可能有点不直观:`enable` 表示“启用新的 C# 8.0 设置,其中类型默认情况下不可为空”。`disable` 的意思是“用旧的方式来做,每种类型都可以为空”。 (9认同)
  • 我只是在VS 2019 / 16.1.1中尝试过,它似乎没有任何作用。为了对其进行测试,然后我将其中一个类放入#nullable enable中,然后可以看到有关空对象的警告。 (3认同)
  • 我还必须从旧的“15,0”更新 &lt;Project ToolsVersion="16.0" ...&gt; 和 &lt;VisualStudioVersion ...&gt;16.0&lt;/VisualStudioVersion&gt;,然后 &lt;Nullable&gt; 才能在旧的非 SDK 项目上工作,即使它们通过 VS 16.3 RTM 的属性 GUI 正确升级到框架 4.8。仅考虑 C#8 语言版本,无需任何额外的项目文件编辑。 (3认同)
  • @LarrySmith 抱歉,此更改是在 16.2P1 中进行的。我已经更新了我的答案。在 16.1.1 中,您仍然需要 `NullableContextOptions`。 (2认同)

Ian*_*ths 29

请注意,此设置在VS 2019预览1和预览2之间更改.使用预览2或3,您需要.csproj:

<PropertyGroup>
  <LangVersion>8.0</LangVersion>
  <NullableContextOptions>enable</NullableContextOptions>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

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

  • 在最近的发行版中,这再次改变了吗?在预览版4.2中,这似乎对我不起作用 (6认同)
  • 由于Visual Studio 6.2 &lt;NullableContextOptions&gt;已简化为&lt;Nullable&gt;(请参见接受的答案) (2认同)

Max*_*nas 20

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

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

<Project>

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

</Project>
Run Code Online (Sandbox Code Playgroud)

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

更多关于Directory.Build.props.


小智 13

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

“构建”选项卡显示“可空”设置

至少在 VS2019 16.6+ 中。

  • 我没有看到那个选项。 (4认同)
  • 但不适用于旧式 csproj。 (2认同)

Ser*_*y V 7

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

<PropertyGroup>
  ...
  <NullableReferenceTypes>true</NullableReferenceTypes>
  <LangVersion>8.0</LangVersion>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

UPD:

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


Ste*_*edy 5

旧版csproj格式

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

  1. <LangVersion>8.0</LangVersion>DebugReleasePropertyGroup部分中添加/更改:

    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
       <LangVersion>preview</LangVersion>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过添加<Nullable>enable</Nullable>到main来启用对可空引用类型的支持PropertyGroup

    <PropertyGroup>
       <Nullable>enable</Nullable>
    
    Run Code Online (Sandbox Code Playgroud)

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


SDK风格的项目文件

SDK样式的项目要简单得多,并且可以在Visual Studio中进行编辑。对于这些你需要的是(在相同PropertyGroupTargetFrameworkTargetFrameworks):

  <PropertyGroup>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
  </PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

笔记

  • 默认情况下,.NET Core 3.x项目以C#8 目标,因此您无需LangVersion为这些项目指定。

  • .NET Framework项目的默认值为C#7.3,即使使用,也不会获得C#8.0 <LangVersion>latest</LangVersion>。您必须将语言版本显式设置为8.0。请参考我对以下问题的回答:C#8是否支持.NET Framework?更多细节。