使用一个?符号表达 Nullable Reference
直接看个C# 例子:
string? str = null;
当加上 '?' 变数 str 可为 null,且编译器不会为此发出警告
Example:
object? GetPotentialNull(bool flag){ return flag ? null : new object();}void Foo(){ object obj = GetPotentialNull(false);}
上述程式码因为GetPotentialNull(false) 写死代入false,
obj 永远不会为 null,但编译器并不能理解这点,还是会发出警告。
您可以通过以下方式抑制警告:
object obj = GetPotentialNull(false)!;
当加上 '!' 运算符,我们向编译器“解释”该方法绝对不会返回 null。
因此,此行程式码片段将不会发出警告。
使用 attributes
举个例子:
public string Name{ get => _name; set => _name = value ?? "defaultName";}private string _name;
如果将 null 值写入 Name,编译器将发出警告:
警告CS8618退出建构函式时,不可为 Null 的 栏位 '_name' 必须包含非 Null 值。请考虑将 栏位 宣告为可为 Null。
如果 _name
的宣告类型 直接加上 '?' 符号表达可 Nullable Reference,如下:
private string? _name;
此时,编译器将发出警告:
警告CS8603可能有 Null 参考传回。ClassLibrary1
此时
存取器 get => _name
可以返回 null(这是一个错误,因为string Name不可为null)
存取器 set => _name
可以接受 null(这是正确的)
这时候该怎么做呢?
public string Name{ get => _name; set => _name = value ?? "defaultName";}[AllowNull]private string _name;
_name
加入属性AllowNull,编译器将假定 _name
可能被分配为 null,儘管类型并未标记为'?',如果将此property的值分配给应该永远不是 null 的变数,编译器不会发出警告。
了解更多:AllowNullAttribute Class
下一篇
在 C# 中 Nullable Reference Types 使用属性NotNullWhen