簡體   English   中英

將 null 合並運算符與條件相結合

[英]Combining null coalescing operator with a conditional

我正在嘗試將合並運算符與條件運算符結合起來。 這不會編譯,我想知道是否有辦法繞過它而不寫一堆 if 語句:

public static Setting GetSetting(this Account account, string key, bool newIfNull = true)
{
    return account.Settings
        .FirstOrDefault(x =>
            x.Key.Equals(key, StringComparison.CurrentCultureIgnoreCase)) ??
                newIfNull ? new Setting
                {
                    Key = key
                } : null
    };
}

這將是 if 語句的替代方案:

public static Setting GetSetting(this Account account, string key, bool newIfNull = true)
{
    var setting = account.Settings
        .FirstOrDefault(x =>
            x.Key.Equals(key, StringComparison.CurrentCultureIgnoreCase));

    if (setting != null)
    {
        return setting;
    }

    return newIfNull ? new Setting
    {
        Key = key
    } : null;
}

有什么建議么? 我也很好奇為什么如果有人知道它就無法編譯。

空合並運算符比三元運算符具有更高的優先級。 這意味着表達式:

thing ?? cond ? t : f

被綁定為:

(thing ?? cond) ? t : f

如果要更改此設置,請使用用於解決每個優先級問題的相同工具:括號。

thing ?? (cond ? t : f)

在您的示例中:

public static Setting GetSetting(this Account account, string key, bool newIfNull = true)
{
    return account.Settings
        .FirstOrDefault(x =>
            x.Key.Equals(key, StringComparison.CurrentCultureIgnoreCase)) ??
                (newIfNull ? new Setting
                {
                    Key = key
                } : null)
    };
}

switch 表達式會更容易閱讀:

var setting = account.Settings
       .FirstOrDefault(x =>x.Key.Equals(key, StringComparison.CurrentCultureIgnoreCase));

return setting switch {
    Setting s=>s,
    null when newIfNull =>new Setting { Key = key },
    _ => null
};

或者

var setting = account.Settings
       .FirstOrDefault(x =>x.Key.Equals(key, StringComparison.CurrentCultureIgnoreCase));

return (setting,newIfNull) 
    switch 
    {
        (Setting s,_)=>s,
        (_,true)  => new Setting { Key = key },
        _ => null
    };

這可以放在一個表達式中,但我懷疑僅這個問題就表明單行並不總是一個好主意:

return account.Settings
       .FirstOrDefault(x =>x.Key.Equals(key, StringComparison.CurrentCultureIgnoreCase))
       switch {
           Setting s=>s,
           null when newIfNull =>new Setting { Key = key },
           _ => null
};

出於學術目的,元組形式是

return ( newIfNull, account.Settings.FirstOrDefault(x =>x.Key.Equals(key, 
                         StringComparison.CurrentCultureIgnoreCase))
    )
    switch 
    {
        (_,Setting s)=>s,
        (true,_)  => new Setting { Key = key },
        _ => null
    };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM