簡體   English   中英

解構元組以進行模式匹配

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

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