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

C#Visual StudioVisual Studio-2019C# 8.0Nullable Reference-Types

C# Problem Overview


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 not find any new appropriate option in the Project Properties window in Visual Studio 2019 Preview 1.

Can it be enabled for 'legacy' .csproj projects if the C# language version is changed to 8.0?

C# Solutions


Solution 1 - C#

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.

Add the following properties to your .csproj file.

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

If you're targeting netcoreapp3.0 or later, you don't need to specify a LangVersion to enable nullable reference types.


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.

Solution 2 - C#

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.

Solution 3 - C#

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.

Solution 4 - C#

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

At least in VS2019 16.6+.

Solution 5 - C#

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.

Solution 6 - C#

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSergey VView Question on Stackoverflow
Solution 1 - C#Drew NoakesView Answer on Stackoverflow
Solution 2 - C#Ian GriffithsView Answer on Stackoverflow
Solution 3 - C#Maxime GélinasView Answer on Stackoverflow
Solution 4 - C#Ian YatesView Answer on Stackoverflow
Solution 5 - C#Sergey VView Answer on Stackoverflow
Solution 6 - C#Stephen KennedyView Answer on Stackoverflow