错误 CS8625 无法将 null 文本转换为不可为 null 的引用类型。
错误 CS8604 “TypeInfo IntrospectionExtensions.GetTypeInfo(Type type)”中“type”形参的可能的 null 引用实参。
今天在调试 .NET 5 源码时遇上了这俩错误,原来从 C#8 起引用类型默认不可为空,除非使用“?”显示地声明这是可空引用类型。
string text1 = "I'm not null by default";
string? text2 = null;
当你想将一个可能为空的值赋给引用类型时,需要使用“!”显示地声明。
string text1 = "I'm not null by default";
string? text2 = null;
text1 = null!;
text1 = text2!;
通过这种方式,引用类型和值类型在是否可空的性质上终于达成了一致,开发者可以节省大量检查空值的精力,Good Job 巨硬。
对于可空引用类型,编译器会担心该变量引发空引用异常,所以如下代码会使编译器抛出错误 CS8604,真是操碎了心
string? text;
...
text.GetType(); // Error CS8604
解决方法是使用“!.”,表示自己很清楚此处 text 不为空,请编译器放心大胆地调用吧
string? text;
...
var type = text!.GetType(); // OK
不过保险起见,先判断一下当然更好啦
string? text;
...
if(!object.ReferenceEquals(text, null))
{
var type = text!.GetType()
}
这个改动影响较大,为了避免不必要的误会,该特性目前默认是关闭的。