[英]Deconstruct tuple for pattern matching
給定一個函數async Task<(Boolean result, MyObject value)> TryGetAsync()
,我可以做到
if((await TryGetAsync()) is var ret && ret.result)
{
//use ret.value
}
但是,如果我嘗試使用聲明類型或使用解構得到錯誤“在此上下文中不允許聲明”:
//declaration. error
if((await TryGetAsync()) is (Boolean result, MyObject value) ret && ret.result)
{
//use ret.value
}
//deconstruction, also error.
if((await TryGetAsync()) is (Boolean result, MyObject value) && result)
{
//use value
}
在這種情況下如何避免使用第一個選項var ret
? 我的問題是類型不明顯(這是一個單獨的討論)。
模式匹配規范不允許將值元組表示法作為模式匹配語法中的有效type_pattern
。
元組符號在編譯器中被重寫以使用ValueTuple
。 所以有一個選項:它確實適用於基礎類型ValueTuple<bool, MyObject>
:
if ((await TryGetAsync()) is ValueTuple<bool, MyObject> ret && ret.Item1)
雖然不理想,但它可以為您提供解決方法。
在 C# 8.0 中,您可以使用最后一個選項並且不會出錯:
if((await TryGetAsync()) is (Boolean result, MyObject value) && result)
{
//use value
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.