C# 定义变量中类型后带一个问号 `?` --可空引用类型(nullable reference types)

tech2023-02-11  97

C# 定义变量中类型后带一个问号 ?

近期在学习开发.Net Core API, Call API 获取User的分组情况,遇到一个报错, 边学边用,在这里记录一下。

报错/异常信息:Unable to cast object of type 'System.DBNull' to type 'System.DateTime'.

Failed to load resource: the server responded with a status of 500 (Internal Server Error); Error message: Unable to cast object of type 'System.DBNull' to type 'System.DateTime'. Exception Trace: " at MySqlConnector.Core.Row.GetDateTime(Int32 ordinal) in C:\projects\mysqlconnector\src\MySqlConnector\Core\Row.cs:line 331 at lambda_method(Closure , QueryContext , DbDataReader , ResultContext , Int32[] , ResultCoordinator ) at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.AsyncEnumerator.MoveNextAsync() at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable`1 source, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable`1 source, CancellationToken cancellationToken) at prewarning_api.Controllers.PWUserGroupUserController.getAll() in /builds/dev/test-api/Controllers/UserGroupUserController.cs:line 39 at lambda_method(Closure , Object ) ......

Debug 发现报错点

定义 DB entity 类时, Database表中的UpdateDate字段是允许为空,而在定义时缺少一个问号 ?,即没有定义为“可为空引用类型”(nullable reference types)。

// 原来的 public DateTime UpdateDate { get; set; } // 定义时缺少一个问号 `?`,即没有定义为"可为空引用类型" // 修正后的 public DateTime? UpdateDate { get; set; } // UpdateDate 在DB是允许为null的字段

可为空引用类型 或 可空类型(nullable reference types)

C# 定义变量中类型后带一个问号 ? :表示这个数据类型是NullAble类型的,该变量允许为null (or unknown) 空值。int? a;用于给变量设初值的时候, 给变量(int类型)赋值为null,而不是0.可为空引用类型, 在获取DB数据的情况下常用, 如上面修正后的例子。可空类型Nullable事实上是一个结构,它将值类型和一个标记该值是否为空的标志位结合在一起。一个可空类型有两个公共可读的属性,HasValue和value。如果存储了一个值,那么HasValue这个布尔型变量就为true; 否则,如果变量是空值就是false。如果HasValue是true,你可以获取这个变量的值。 int? i=7; // 等同于 Nullable<int> i = new Nullable<int>(7); // 和nullable是一样的就是值允许为空 // Nullable 的结构: struct Nullable<T> { public bool HasValue; // 标志是否有值 public T Value; } 详情参考 C#官网文档: 可为空引用类型; 选择用 可为空引用类型的策略

结束语

总得来说,最新的C#允许一个可空类型的存在。语言内部建立了对可空类型的处理机制。可空类型使得数据库记录和其他可选信息更加的容易处理。

顺便记录一下:

c# 条件判断运算符

三元运算符:a ? b : c a?b:c //表示如果表达式a为true,则返回b;如果a为false,则返回c 空合并运算符: a ?? b a??b //表示a不为null时则返回a, 当a为null时则返回b
最新回复(0)