如何为整个项目启用C#8.0的Nullable引用类型功能


Answers:


79

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

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

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


对于较旧的Visual Studio版本:

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

3
我只是在VS 2019 / 16.1.1中尝试过,它似乎没有任何作用。为了对其进行测试,然后进入其中一个类中的#nullable enable中,然后可以看到有关空对象的警告。
拉里·史密斯

2
@LarrySmith道歉,此更改是在16.2P1中进行的。我已经更新了答案。在16.1.1中,您NullableContextOptions仍然需要。
Drew Noakes

1
请注意,布尔逻辑可能有点不直观:enable表示“启用新的C#8.0设置,其中默认情况下类型不能为空”。 disable意思是“用旧的方法将每种类型都设为可空值。”
Ryan Lundy

1
我还必须从较旧的“ 15,0”更新<Project ToolsVersion =“ 16.0” ...>和<VisualStudioVersion ...> 16.0 </ VisualStudioVersion>,然后<Nullable>在较旧的非SDK项目上运行,即使已通过VS 16.3 RTM的属性GUI将它们正确升级到框架4.8。在不进行任何其他项目文件编辑的情况下,仅尊重C#8语言版本。
Tony Wall,

1
@TonyWall我很好奇你为什么需要它。我刚刚在VS 16.3.7中创建了一个新的.NET Framework控制台应用程序(即非SDK样式的项目),LangVersionNullable为其添加了和属性,.csproj并且运行良好。该项目也有ToolsVersion="15.0"
Drew Noakes

32

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

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

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


有关可用值此选项(了解更多信息enabledisablesafeonly:等)github.com/dotnet/roslyn/blob/master/docs/features/...
谢尔盖V

8
在最近的发行版中,这再次改变了吗?在预览版4.2中,这似乎对我不起作用
waldrumpus,

5
由于Visual Studio 6.2 <NullableContextOptions>已简化为<Nullable>(请参见接受的答案)
Andrew Hill,

13

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

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

<Project>

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

</Project>

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

更多关于 Directory.Build.props


7

对于Visual Studio 2019 Preview 2和3,请参见Ian Griffiths的答案

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

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

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

正如@JulienCouvreur在有关https://github.com/dotnet/project-system/issues/4058的注释中引用的那样,“旧”项目系统尚不支持新属性。但是将在C#8.0发布之前受支持。


您是否尝试过将目标框架更改为net472?您如何/在何处找到该设置?该参考将非常有用。我发现很多事情不太如图所示的视频作品
帕纳约蒂斯Kanavos

@PanagiotisKanavos,该标签是Mads Torgersen在YouTube上的评论中提出的-我在原始问题中链接的视频的作者
Sergey V

1
“旧”项目尚不支持此属性。问题由github.com/dotnet/project-system/issues/4058
Julien Couvreur

7

旧版csproj格式

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

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

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

    <PropertyGroup>
       <Nullable>enable</Nullable>
    

在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>

笔记

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

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


2

值得注意的是,这也是项目“属性”页面中的公开设置: “构建”选项卡显示“空”设置

至少在VS2019 16.6+中

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.