强制执行 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
我刚刚尝试了新的 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