我正在尝试检查对象的状态,如果它为null,则我需要返回null,否则,我需要返回Guid
或Bool
。
Portrait_Enabled = _SiteImagesModel_ImagesViewModel == null ? null : _SiteImagesModel_ImagesViewModel.Enabled,
Portrait_PrimaryImage = _SiteImagesModel_ImagesViewModel.PrimaryImage ?? null,
Portrait_RecordID = _SiteImagesModel_ImagesViewModel.RecordID ?? null,
Portrait_RelatedImage = _SiteImagesModel_ImagesViewModel.RelatedImage ?? null,
我已经尝试过??
和? :
,我收到编译错误说明:
- 无法确定条件表达式的类型,因为
<null>
和bool
之间没有隐式转换- 操作员
类型的操作数??
无法应用于bool
和<null>
- 操作员
类型的操作数??
无法应用于Guid
和<null>
Guid
和Bool
值均为Nullable
。
答案 0 :(得分:2)
关于null-coalescing运算符的MS Docs explanation(注意强调部分):
可空类型可以表示类型域中的值,或者 value可以是未定义的(在这种情况下,值为null)。您可以使用 ?? ??运算符的句法表达能力返回一个合适的 当左操作数具有不可用时的值(右手操作数) type为null的类型。如果您尝试分配可以为null的值类型 不使用??的非可空值类型操作员,你会的 生成编译时错误。如果使用强制转换,则可以为空 值类型当前未定义,InvalidOperationException 异常将被抛出。
由于右侧操作数必须返回相应数据类型的适当值,因此即使指定的变量具有可空数据类型,也不能将其直接设置为空(两个操作数必须具有相同的数据类型)。
基本上,当您将null-coalescing运算符定义为:
Portrait_PrimaryImage = _SiteImagesModel_ImagesViewModel.PrimaryImage ?? [DefaultValueIfNull];
它将翻译为:
Portrait_PrimaryImage = _SiteImagesModel_ImagesViewModel.PrimaryImage == null ? [DefaultValueIfNull] : _SiteImagesModel_ImagesViewModel.PrimaryImage;
由于三元运算符和运算符中的两个操作数都是null-coalescing运算符必须具有相同的类型,如果仍希望传递null值,则可以将右侧操作数转换为正确的类型,如下所示:
Portrait_PrimaryImage = _SiteImagesModel_ImagesViewModel.PrimaryImage ?? (bool?)null;
Portrait_RecordID = _SiteImagesModel_ImagesViewModel.RecordID ?? (Guid?)null;
Portrait_RelatedImage = _SiteImagesModel_ImagesViewModel.RelatedImage ?? (bool?)null;
请注意,null
与Nullable<bool>
的类型不同,您需要转换为bool?
才能获得相同的数据类型。
与你的情况一样,三元运算符的使用就足够了,当第二个操作数是null
时,不需要使用null-coalescing运算符:
Portrait_Enabled = _SiteImagesModel_ImagesViewModel == null ? null : (bool?)_SiteImagesModel_ImagesViewModel.Enabled;
Portrait_RecordID = _SiteImagesModel_ImagesViewModel == null ? null : (Guid?)_SiteImagesModel_ImagesViewModel.RecordID;
Portrait_RelatedImage = _SiteImagesModel_ImagesViewModel == null ? null : (bool?)_SiteImagesModel_ImagesViewModel.RelatedImage;
参考文献: