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

时间:2018-12-05 13:33:04

标签: c# visual-studio c#-8.0 visual-studio-2019

根据新的名为“可空引用类型”的C#8.0功能的发布,可以为整个项目启用它。 (此处提到:https://youtu.be/VdC0aoa7ung?t=137) 但是如何为项目启用它?在Visual Studio 2019 Preview 1的“项目属性”窗口中找不到任何新的适当选项。如果C#语言版本更改为8.0,可以为“ .NET Framework”旧项目启用该选项吗?

6 个答案:

答案 0 :(得分:21)

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

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

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

答案 1 :(得分:7)

对于Visual Studio 2019 P 评论2和3 ,请参阅Ian Griffiths的答案

Visual Studio 2019解决方案 预览1

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

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

UPD:

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

答案 2 :(得分:3)

在Visual Studio 16.1中,属性名称更改为Nullable,它更简单并且与命令行参数对齐。

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

答案 3 :(得分:3)

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

"Build" tab shows "Nullable" setting

至少在VS2019 16.6+中。

答案 4 :(得分:1)

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

只需这样定义您的.sln文件:

Directory.Build.props

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

有关Directory.Build.props

的更多信息

答案 5 :(得分:0)

您询问了旧版.csproj格式。通过手动进行以下更改,我已经能够在Visual Studio 2019(v16.2.0 Preview 3)中使用C#8编译.NET WinForms应用程序:

  1. <LangVersion>preview</LangVersion>8.0 PropertyGroup部分添加Debug(或Release):

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

    <PropertyGroup>
       <Nullable>enable</Nullable>
    

使用此配置,可为空的引用类型将编译而不会发出警告或错误。

如果删除<Nullable>enable</Nullable>,则项目会编译,但编译器会警告“ CS8632:可为空的引用类型的注释只能在“ #nullable”上下文中的代码中使用。”

如果需要更多信息,请参考我对问题Does C# 8 support the .NET Framework?的回答。


SDK样式的项目要简单得多,并且可以在Visual Studio中进行编辑。对于这些,您需要做的就是(与PropertyGroupTargetFramework位于同一TargetFrameworks中)

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

在两种情况下,一旦C#8退出预览,您可能都想使用<LangVersion>latest</LangVersion>-有关更多信息,请参见MSDN上的C# language versioning