【问题标题】:?? and ternary operations with Bool? and Guid? types??和 Bool 的三元运算?和指导?类型
【发布时间】:2017-10-03 15:53:56
【问题描述】:

我正在尝试检查一个对象的状态,如果它是 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

【问题讨论】:

  • 您分配给的变量和您的对象_SiteImagesModel_ImagesViewModel的类型是什么?..
  • 哪些行给出了实际错误,因为您的错误很清楚,可能只是一个小错误
  • ?? null 毫无意义。 ?? 运算符的目的是提供一个不同的值当左操作数为空时。 “如果值为 null,则使用 null”是多余的,它的功能等效于 myBool == true
  • 您已经在异常内容中解释了所有内容。 Portrait_Enabled = _SiteImagesModel_ImagesViewModel == null ? null : _SiteImagesModel_ImagesViewModel.Enabled 应该是 Portrait_Enabled = _SiteImagesModel_ImagesViewModel == null ? null : (bool?)_SiteImagesModel_ImagesViewModel.Enabled
  • 还请展示大图 - 这是使用对象初始化器初始化方法的一部分 - 请展示它

标签: c#


【解决方案1】:

MS Docs explanation 关于空合并运算符(注意强调部分):

可以为空的类型可以表示来自该类型域的值,或者 值可以是未定义的(在这种情况下,该值为空)。您可以使用 这 ?? 返回适当的运算符的句法表达能力 左操作数具有可空值时的值(右手操作数) 值为 null 的类型。如果您尝试分配一个可为空的值类型 到一个不可为空的值类型而不使用 ??运营商,你会 产生编译时错误。如果您使用演员表,并且可以为空 值类型当前未定义,InvalidOperationException 会抛出异常。

由于右侧操作数必须返回相应数据类型的适当值,因此即使分配的变量具有可为空的数据类型(两个操作数必须具有相同的数据类型),也不能直接设置为null。

基本上当你这样定义一个空合并操作符时:

Portrait_PrimaryImage = _SiteImagesModel_ImagesViewModel.PrimaryImage ?? [DefaultValueIfNull];

翻译成这样:

Portrait_PrimaryImage = _SiteImagesModel_ImagesViewModel.PrimaryImage == null ? [DefaultValueIfNull] : _SiteImagesModel_ImagesViewModel.PrimaryImage;

由于三元运算符和空合并运算符中的两个操作数必须具有相同的类型,如果您仍然希望传递空值,您可以将右侧的操作数转换为正确的类型,如下所示:

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时,不需要使用空合并运算符:

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

【讨论】:

    猜你喜欢
    • 2017-01-20
    • 2012-12-15
    • 2014-10-03
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    相关资源
    最近更新 更多