Use .NET Core 3.0's new nullable attributes in older target frameworks.
You may also want to check out my IsExternalInit
project which provides support for C# 9's
record keywords for older target frameworks.
With the release of C# 8.0, support for nullable reference types
has been added to the language.
Futhermore, .NET Core 3.0 added new nullable attributes
which are sometimes required to exactly declare when and how
null is allowed in specific code
Unfortunately, these attributes are not available in older target frameworks like .NET Standard 2.0
which makes annotating existing code harder.
Luckily, this problem can be solved by re-declaring the attributes as
internal classes - the C#
compiler will still use them for generating warnings, even though the target framework doesn't
support these attributes by itself.
This repository hosts the code for the "Nullable" NuGet Package which, when referenced, adds support for these attributes.
The code for these attributes is added at compile time and gets built into the referencing project.
This means that the resulting project does not have an explicit dependency on the
package, because the attributes are not distributed as a library.
Futhermore, the code only gets added to the project if the nullable attributes are not already supported by the target framework. The images below show an example - in the library which targets .NET Standard 2.0, the attributes have been added during the compilation. That is not the case for the library targeting .NET Standard 2.1, because the attributes are available through the .NET BCL there. This allows you to easily multi-target your projects without having to change a single line of code.
|.NET Standard 2.0||.NET Standard 2.1|
Nullabe is currently compatible with the following target frameworks:
Please have a look at the guides for additional information on how to install the package for your target framework.
You must use a C# version >= 8.0 with the
Nullablepackage - otherwise, your project won't compile.
The steps below assume that you are using the new SDK
Please find installation guides and notes for other project types (for example
Reference the package
Add the package to your project, for example via:
Install-Package Nullable --or-- dotnet add package Nullable
Ensure that the package has been added as a development dependency
.csproj file and ensure that the new package reference looks similar to this:
<PackageReference Include="Nullable" Version="<YOUR_VERSION>"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> <!-- This style also works, but is not automatically used by .NET: --> <PackageReference Include="Nullable" Version="<YOUR_VERSION>" PrivateAssets="all" />
This is especially important for libraries that are published to NuGet, because without this,
the library will have an explicit dependency on the
Build the project
Ensure that the project compiles. If a build error occurs, you will most likely have to update the C# language version (see next step).
Enable Nullable Reference Types
Still in your
.csproj file you need to activate the feature to fully use it.
The following activation sample is what seems to be the most common use case.
But do not hesitate to look at my guides for other considerations.
<PropertyGroup> <!-- Your desired target frameworks. --> <TargetFrameworks>net472;netstandard2.0;netstandard2.1;netcoreapp3.0</TargetFrameworks> <!-- The C# language version to use. Must be at least 8.0 (other suggestions: 9.0, latest, preview).--> <LangVersion>8.0</LangVersion> <!-- or --> <LangVersion>latest</LangVersion> <!-- Enable nullable reference types. You can also use "annotations" instead of "enable" to prevent the compiler from emitting warnings. --> <Nullable>enable</Nullable> </PropertyGroup>
For WPF users:
There have been issues with WPF projects in the past which resulted in compilation errors, however these have been fixed with the .NET 5.0.102 SDK. To get Nullable working with your WPF project, ensure that you are using an SDK >= 5.0.102 SDK and then add the following configuration to your
You should now be ready to use Nullable Reference Types and the corresponding attributes even when targeting legacy frameworks.
The included C# file makes use of some compiler constants that can be used to enable or disable certain features.
NULLABLE_ATTRIBUTES_DISABLE constant is defined, the attributes are excluded from the build.
This can be used to conditionally exclude the attributes from the build if they are not required.
In most cases, this should not be required, because the package automatically excludes the attributes from target frameworks that already support these attributes.
By defining the
NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE constant, the
attributes are not applied and the nullable attributes may therefore appear in code coverage reports.
Because the package consists of source files, building works differently than a normal .NET project.
In essence, no build has to be made at all. Instead, the
*.cs files are renamed to
(because otherwise, Visual Studio's solution explorer would display the files in a project which
references the package) and then packaged into a NuGet package via a
The solution contains a
_build project which automatically performs these tasks though. You can then
find the resulting NuGet package file in the
I don't expect this package to require many changes, but if something is not working for you or if you think that the source file should change, feel free to create an issue or Pull Request. I will be happy to discuss and potentially integrate your ideas!
See the LICENSE file for details.