[英]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.