web-dev-qa-db-ja.com

タプルとのC#7パターンマッチ

次のように、c#7を使用してswitchステートメントでパターンマッチング付きのタプルを使用することは可能ですか?

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;
}
13
jharr100

C#7タプルは単なる構文糖衣であるため、(object, object)は本当にSystem.ValueTuple<object, object>

開発チームは、タプルの新しい構文についてこの特定の状況を考慮していなかったと思いますが、これは可能です。

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

また、「var pattern」は何にでも一致し、タイプを尊重するため、上記は次のように簡略化できます。

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