C#中JsonPosition?语法困惑:无法理解空值类型构造写法
关于C#代码中
JsonPosition?和构造语法的解释 1. 类名后的问号?的含义
在C#中,Type?分两种场景:
- 若
Type是值类型(结构体、枚举等),Type?是Nullable<Type>的语法糖,代表该变量可存储null值,属于运行时层面的可空类型。 - 若
Type是引用类型(类),这是C# 8.0及以后引入的可空引用类型标记,仅作为编译时静态检查提示,告诉编译器该变量允许被赋值为null,运行时本质仍是普通引用类型变量。
你提到JsonPosition是类,所以这里的JsonPosition?是可空引用类型声明,表明currentPosition变量可以接收null值。
2. new JsonPosition?(_currentPosition)的构造逻辑
你觉得JsonPosition没有同类型构造函数,但这里构造的并非JsonPosition本身,而是可空类型的包装实例:
- 若
JsonPosition实际是值类型(可能你误判为类),JsonPosition?等价于Nullable<JsonPosition>,而Nullable<T>自带接收T类型参数的构造函数,用来创建包含非空值的可空实例。 - 若
JsonPosition确实是类,这段代码属于冗余写法——因为引用类型本身可直接赋值,new JsonPosition?(_currentPosition)完全等价于直接写_currentPosition。Newtonsoft.Json的这段代码可能是为了兼容旧版本,或是统一值类型/引用类型的可空写法。
转写为C++/CLI的对应写法
C++/CLI没有直接对应C#可空引用类型的语法,可按两种情况处理:
- 若
JsonPosition是值类型(结构体),使用Nullable<JsonPosition>,构造时写Nullable<JsonPosition>(_currentPosition)即可。 - 若
JsonPosition是引用类型(类),直接用JsonPosition^,因为C++/CLI中引用类型句柄本身就可赋值为nullptr,代码可简化为:
JsonPosition^ currentPosition = ((_currentState != State::ArrayStart && _currentState != State::ConstructorStart && _currentState != State::ObjectStart) ? _currentPosition : nullptr);
内容的提问来源于stack exchange,提问作者Coderino
相关产品推荐
相关产品推荐

