当前位置:  开发笔记 > 编程语言 > 正文

为什么空传播不一致地传播Nullable <T>?

如何解决《为什么空传播不一致地传播Nullable<T>?》经验,为你挑选了1个好方法。

我特别提到了对null传播的关注,因为它涉及到返回方法bool?的使用bool.例如,请考虑以下事项:

public static bool IsAttributedWith(this JsonProperty property) 
    where TAttribute : Attribute
{
    return property?.AttributeProvider
                    .GetAttributes(typeof(TAttribute), false)
                    .Any();
}

这不编译,并存在以下错误:

不能隐含转换bool?布尔.存在显式转换(您是否错过了演员表)?

这意味着它是治疗方法的整个身体bool?,因为这样我会承担,我可以说.GetValueOrDefault().Any(),但这是不允许的.Any()回报bool不是bool?.

我知道我可以做以下任何一种解决方法:

public static bool IsAttributedWith(this JsonProperty property) 
    where TAttribute : Attribute
{
    return property?.AttributeProvider
                    .GetAttributes(typeof(TAttribute), false)
                    .Any()
        ?? false;
}

要么

public static bool IsAttributedWith(this JsonProperty property) 
    where TAttribute : Attribute
{
    var any = 
        property?.AttributeProvider
                 .GetAttributes(typeof(TAttribute), false)
                 .Any();

     return any.GetValueOrDefault();
}

要么

public static bool IsAttributedWith(this JsonProperty property) 
    where TAttribute : Attribute
{
    return property?.AttributeProvider
                    .GetAttributes(typeof(TAttribute), false)
                    .Any()
        ?? false;
}

我的问题是,为什么我不能直接调用.GetValueOrDefault()链接.Any()调用?

public static bool IsAttributedWith(this JsonProperty property) 
    where TAttribute : Attribute
{
    return (property?.AttributeProvider
                    .GetAttributes(typeof(TAttribute), false)
                    .Any())
                    .GetValueOrDefault();
}

我认为这是有道理的,因为价值实际上是bool?在这一点而不是bool.



1> user4003407..:

经过?.运营商所有后续调用链解释为条件,不仅直接调用.所以,这段代码:

property?.AttributeProvider
         .GetAttributes(typeof(TAttribute), false)
         .Any()

解释为

property==null ? (bool?)null : property.AttributeProvider
                                       .GetAttributes(typeof(TAttribute), false)
                                       .Any()

如果你添加GetValueOrDefault():

property==null ? (bool?)null : property.AttributeProvider
                                       .GetAttributes(typeof(TAttribute), false)
                                       .Any()
                                       .GetValueOrDefault()

它会失败,因为没有Any()回报.因此,您需要在此处使用括号:boolbool?

(property==null ? (bool?)null : property.AttributeProvider
                                        .GetAttributes(typeof(TAttribute), false)
                                        .Any())
                                        .GetValueOrDefault()

使用?.运算符时需要使用的相同括号:

(property?.AttributeProvider
          .GetAttributes(typeof(TAttribute), false)
          .Any())
          .GetValueOrDefault()

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有