You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么C#中未在构造函数赋值的long字段不会触发非空告警?

核心原因

你开启的Nullable项目配置对应的是可空引用类型(NRT) 校验能力,该能力的校验范围仅覆盖引用类型,不会对值类型触发未赋值的非空告警。
你代码中的FieldTwo属于long类型,是值类型,值类型在实例化时会被自动赋予对应默认值(long的默认值为0),哪怕你没有在构造函数中显式赋值也不存在空引用风险,因此不会触发相关告警。
作为对比,你代码里的FieldOne是string引用类型,如果你删除构造函数中FieldOne = p1的赋值逻辑,就会收到明确的非空未赋值告警,符合Nullable配置的校验规则。

补充方案

如果你希望强制要求值类型字段必须在构造函数中显式赋值、不使用默认值,可以选择以下方案:

  • 将字段声明为可空值类型(例如long? FieldTwo),此时如果构造函数未赋值就会触发可空告警,但是你需要在后续业务逻辑中显式处理可空判断
  • 升级到.NET 7+对应C# 11及以上版本,给字段加required修饰符,此时编译器会强制要求构造时必须给该字段赋值,否则会直接抛出编译错误
  • 引入自定义Roslyn分析器,配置针对值类型未显式赋值的校验规则

内容的提问来源于stack exchange,提问作者cdimitroulas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:57:02