在 C# 中 Nullable Reference Types 使用属性AllowNull

使用一个?符号表达 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(这是正确的)

http://img2.58codes.com/2024/20152569aBidIgjoen.jpg

这时候该怎么做呢?

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


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章