Will consumers of a Nuget package written in C# 8 with nullable reference types see the information about nullability of fields / parameters defined in that package? Will the C# 8 compiler be able to use that information to issue appropriate warnings?
Yes, provided they also use C# 8 or later and have Nullable enabled. This already happens with the BCL types.
NRTs in C# 8 don't introduce a new kind of type. The compiler generates  NullableContext and Nullable attributes in projects or files where NRTs are enabled. These are used to analyze the code and issue nullability warnings. Whether nullability is enabled or not, a string and a string? are still the same type, a string. 
Jon Skeet's NullableAttribute And C# 8 explains how those attributes work and how they affect the public API of a package, in this case Noda Time. The package was ported to C# 8 back in February 2019.
As Jon Skeet explains:
The C# 8 compiler creates an internal NullableAttribute class within the assembly (which I assume it wouldn’t if we were targeting a framework that already includes such an attribute) and applies the attribute anywhere it’s relevant.
This makes the change transparent to older C# compilers
Check this Sharplab.io example. The following simple class:
#nullable enable
using System;
public class C {
    public void M(C c) {
    }
}
Generates this intermediate C# code:
public class C
{
    [System.Runtime.CompilerServices.NullableContext(1)]
    public void M(C c)
    {
    }
}
While this :
    public C M(C? c) {
        return c ?? throw new ArgumentNullException(nameof(c));
    }
Generates this intermediate C# :
    [System.Runtime.CompilerServices.NullableContext(1)]
    public C M([System.Runtime.CompilerServices.Nullable(2)] C c)
    {
        if (c != null)
        {
            return c;
        }
        throw new ArgumentNullException("c");
    }
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With