2017-06-22 83 views
6

是否有可能在使用C#7,像這樣的switch語句使用元組模式匹配:C#7模式與之匹配的元組

switch (parameter) 
{ 
    case ((object, object)) tObj when tObj.Item1 == "ABC": 
     break; 
} 

我得到那個說tObj does not exist in the current context錯誤。

我曾經嘗試這樣做,以及:

switch (parameter) 
{ 
    case (object, object) tObj when tObj.Item1 == "ABC": 
     break; 
} 

這工作得很好:

switch (parameter) 
{ 
    case MachineModel model when model.Id == "123": 
     break; 
} 

回答

8

請記住,C#7元組只是語法糖,所以(object, object)真的只是System.ValueTuple<object, object>

我想的是,開發團隊並沒有採取這種特定的情況考慮爲元組的新語法,但你可以這樣做:

switch (parameter) 
{ 
    case System.ValueTuple<object, object> tObj when tObj.Item1 == "x": 
     break; 
} 

此外,由於「變種模式」將匹配任何並尊重類型,以上可簡化爲:

switch (parameter) 
{ 
    case var tObj when tObj.Item1 == "x": 
     break; 
} 
+2

@DavidArno感謝您的編輯,但使用'var'有一個問題。如果'parameter'是'object'類型,並且switch語句也用於檢查類型,則會失敗。 [例如](https://gist.github.com/WiredUK/21d1a61c01580a2fe7b055ec83b46889) – DavidG

+0

好點。我從這個問題推斷出'參數'是一個元組,但這可能是一個糟糕的假設。 –

+2

@DavidArno我認爲這幾乎肯定是,這就是爲什麼我沒有調整你的編輯。只是認爲這裏值得一提。 – DavidG