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; }
可为空引用类型 或 可空类型(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);
struct Nullable
<T
>
{
public bool HasValue
;
public T Value
;
}
详情参考 C#官网文档: 可为空引用类型; 选择用 可为空引用类型的策略
结束语
总得来说,最新的C#允许一个可空类型的存在。语言内部建立了对可空类型的处理机制。可空类型使得数据库记录和其他可选信息更加的容易处理。
顺便记录一下:
c# 条件判断运算符
三元运算符:a ? b : c
a
?b
:c
空合并运算符: a ?? b
a
??b