.NET8 Blazor中可空类属性导致int可空,如何获取int值?
.NET 8 Blazor中可空int转int的处理方案
你遇到的核心问题是MyDTO?.RefreshRate返回的是int?(可空值类型),而Timer构造函数需要的是int类型参数。下面是几种直接有效的处理方式:
1. 用空合并运算符指定默认值
如果MyDTO为空时,希望用一个默认的刷新频率(比如1000毫秒),可以直接用??运算符把可空int转成int:
var refreshRate = MyDTO?.RefreshRate ?? 1000; TruckSearchTimer = new Timer(new TimerCallback(async _ => { if (!cts.IsCancellationRequested) { // 业务逻辑 } await InvokeAsync(StateHasChanged); }), null, refreshRate, refreshRate);
2. 使用GetValueOrDefault()方法
如果接受int的默认值(0),或者想自定义默认值,可以用可空值类型的GetValueOrDefault方法:
// 用int默认值0 var refreshRate = MyDTO?.RefreshRate.GetValueOrDefault(); // 或者指定默认值 var refreshRate = MyDTO?.RefreshRate.GetValueOrDefault(500);
3. 确认非空后直接取值
如果你已经通过if (MyDTO is not null)判断过对象非空,可以用**null包容运算符!**直接取值(确保此时MyDTO一定不为null,否则会抛NullReferenceException):
if (MyDTO is not null) { var refreshRate = MyDTO!.RefreshRate; // 初始化Timer }
关于.Value找不到的问题
int?类型本身确实有.Value属性,但如果直接在未判断HasValue的情况下使用,编译器可能会提示空引用警告,或者你可能在声明变量时出现了推断错误。正确的用法是先判断是否有值:
var refreshRate = MyDTO?.RefreshRate; if (refreshRate.HasValue) { int rate = refreshRate.Value; // 使用rate初始化Timer } else { // 处理MyDTO为空的情况,比如不初始化Timer或用默认值 }
内容的提问来源于stack exchange,提问作者GH DevOps
相关产品推荐
相关产品推荐

