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

C#中能否实现Getter非可空、Setter可空的属性?

在C#中实现可空 backing field + 非可空Getter的属性

完全可以实现,你给出的代码本身就是正确的解决方案。

  • 你的Date1属性Getter返回非可空的DateTime,通过_date1 ?? Date2的兜底逻辑,确保外部获取该属性时永远不会拿到null,完美达成“向代码其他部分保证返回值不为空”的需求。
  • 由于属性的公开类型是DateTime(非可空),外部无法给Date1赋值null,这也是你代码里foo.Date1 = null;编译失败的原因,刚好符合预期。
  • 内部的可空字段_date1属于实现细节,外部代码无需感知,既保留了C#属性访问的便捷性,又满足了业务逻辑要求,完全不需要改用单独的方法。

示例代码

public class Foo(DateTime date2)
{
    private DateTime? _date1;
    public DateTime Date1
    {
        get => _date1 ?? Date2;
        set => _date1 = value;
    }
    public DateTime Date2 { get; } = date2;
}
    
var foo = new Foo(DateTime.Now)
{
    Date1 = DateTime.Now.AddDays(1)
};
foo.Date1 = null; // 编译不通过,符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:52:35