C#中Nullable列表的正确声明方式及赋值规则咨询
问题解答
一、属性声明有效性
你列出的三个类属性声明全部有效,各自含义如下:
public List<int>? _Int1 { get; set; }:可空的List<int>类型属性,属性本身可以赋值为null,但列表内的元素是不可空的int。public List<int?> _Int2 { get; set; }:不可空的List属性,列表内的元素是可空的int(int?是Nullable<int>的语法糖)。public List<Nullable<int>> _Int3 { get; set; }:和_Int2完全等价,通过显式Nullable<int>声明可空值类型元素,列表本身不可空。
二、赋值结果解析
_s._Int1 = new List<int?> { 0 };失败:List<int>和List<int?>是不同的泛型类型,C#不支持这两种泛型列表之间的隐式转换——即使int可以隐式转为int?,容器类型本身不兼容,因此赋值失败。_s._Int2 = new List<Nullable<int>> { 0 };成功:int?是Nullable<int>的语法糖,编译后两者完全一致,所以List<int?>和List<Nullable<int>>属于同一类型,赋值自然有效。_s._Int3 = new List<int?> { 0 };成功:
同理,int?与Nullable<int>等价,对应的泛型列表类型完全相同,因此赋值有效。
三、Nullable的正确声明方式
在C#中,声明可空值类型有两种完全等价的方式:
- 推荐写法:语法糖
T?:比如int?、bool?,写法简洁可读性高,是日常开发的首选。 - 底层写法:
Nullable<T>:这是语法糖对应的底层泛型结构体实现,功能和T?完全一致,适合需要显式表达可空逻辑的场景。
内容的提问来源于stack exchange,提问作者EBDS
相关产品推荐
相关产品推荐

