??与Bool一起进行三元运营?和Guid?类型

时间:2017-10-03 07:09:23

标签: c#

我正在尝试检查对象的状态,如果它为null,则我需要返回null,否则,我需要返回GuidBool

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>
  • 类型的操作数   

GuidBool值均为Nullable

1 个答案:

答案 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;

请注意,nullNullable<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;

参考文献:

Type of conditional expression cannot be determined because there is no implicit conversion between 'int' and <null>

How to set null to a GUID property