How to enable Nullable Reference Types feature of C# 8.0 for the whole project

前端 未结 6 1790
庸人自扰
庸人自扰 2020-12-05 03:44

According to the C# 8 announcement video the \"nullable reference types\" feature can be enabled for the whole project.

But how to enable it for the project? I did n

相关标签:
6条回答
  • 2020-12-05 04:07

    In Visual Studio 16.2 (from preview 1), the property name is changed to Nullable, which is simpler and aligns with the command line argument.

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

    Note that if you're targeting netcoreapp3.0 or later, you don't need to specify a LangVersion of 8, as that is the default in .NET Core 3.


    For older Visual Studio versions:

    • From 16.0 preview 2 to 16.1, set NullableContextOptions to enable.
    • In 16.0 preview 1, set NullableReferenceTypes to true.
    0 讨论(0)
  • 2020-12-05 04:19

    For Visual Studio 2019 Preview 2 & 3, see Ian Griffiths's answer.

    Solution for Visual Studio 2019 Preview 1:

    To enable Nullable Reference Types feature for the .NET Core project, add NullableReferenceTypes property to the .csproj file like this:

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

    As @JulienCouvreur referenced in comments regarding to https://github.com/dotnet/project-system/issues/4058, the new property is not yet supported in 'old' project system, but will be supported before C# 8.0 released.

    0 讨论(0)
  • 2020-12-05 04:24

    Worth noting that, by now, this is also an exposed setting in a project's Properties page:

    At least in VS2019 16.6+.

    0 讨论(0)
  • 2020-12-05 04:25

    Note that this setting is changed between VS 2019 preview 1 and preview 2. With preview 2 or 3, you need this in your .csproj:

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

    The <NullableReferenceTypes> mentioned in the earlier answer (which, when I originally wrote this answer on 4th Feb 2019, had been marked as the accepted answer) was correct at the time that answer was written, but it is no longer recognized.

    0 讨论(0)
  • 2020-12-05 04:30

    Legacy csproj format

    You asked about the legacy .csproj format. Open up the project file in a text editor and make the following changes:

    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>
      

    Tested with a .NET WinForms app using C# 8 and nullable reference types syntax in Visual Studio 2019 v16.2.0 Preview 3.


    SDK-style project files

    SDK style projects are much simpler, and can be edited within Visual Studio. For these all you need is (in the same PropertyGroup as TargetFramework or TargetFrameworks):

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

    Notes

    • .NET Core 3.x projects target C# 8 by default, so you won't need to specify the LangVersion for those projects.

    • The default for .NET Framework projects is C# 7.3, and you don't get C# 8.0 even with <LangVersion>latest</LangVersion>. You must explicitly set the language version to 8.0. Please refer to my answer to the question Does C# 8 support the .NET Framework? for more details.

    0 讨论(0)
  • 2020-12-05 04:32

    In addition to @DrewNoakes accepted answer, note that the nullable property can be set for all projects at once by adding a file called Directory.Build.props in the folder that contains your .sln file.

    Just define your Directory.Build.props file like this:

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

    You will need to restart Visual Studio for this to take effect.

    More about Directory.Build.props.

    0 讨论(0)
提交回复
热议问题