强制执行 REAL 不可空字符串引用类型

Enforce REAL non-nullable string reference type

我刚刚尝试了新的 C# 8 Nullable Reference Type,它允许我们使用不可为 null 的字符串。

在我的 .csproj (.NET Core 3.1) 中,我设置了这个:

<Nullable>enable</Nullable>

我创建了一个FooClass如下:

public class FooClass
{
    public FooClass(string testString, DateTime testDate)
    {
        if (testString == null || testString == string.Empty)
            throw new ArgumentNullException(nameof(testString));
        else if (testDate == null)
            throw new ArgumentNullException(nameof(testDate));

        MyString = testString;
        MyDate = testDate;
    }

    public string MyString { get; }
    public DateTime MyDate { get; }
}

但是,当我在我的 Main() 中创建我的 class 的新实例时,我故意使用 null 值:

var test = new FooClass(testString:null, testDate:null);

编译器使用 testString 参数没问题,但是使用 testDate 参数它告诉我:

Argument 2: cannot convert from '<null>' to 'DateTime'

如何才能使第一个参数具有相同的行为?

我的testString参数是不可为空的引用类型,就像testDate一样。因为我没有将它声明为 string?,所以我希望编译器对两个参数的行为相同。

在 C# 中是否有其他功能可以激活以强制执行 真实 不可为 null 的字符串?

您可以将 TreatWarningsAsErrors 选项添加到您的 csproj 文件

<TreatWarningsAsErrors>true</TreatWarningsAsErrors>

或将 CS8625 警告添加到 WarningsAsErrors 列表

<WarningsAsErrors>NU1605;CS8625</WarningsAsErrors>

并且这段代码会产生预期的错误

var test = new FooClass(testString: null, testDate: default);

error CS8625: Cannot convert null literal to non-nullable reference type.

可空引用类型在 CLR 中作为类型注释实现,这可能是编译器首先在原始示例中向您显示 testDate 错误的原因。

var test = new FooClass(testString: null, testDate: null);

消除此错误后,您将看到可空引用的预期行为 errors/warnings