对值类型元组使用`is`运算符会产生错误

ilk*_*ran 18 c# valuetuple

我正在尝试检查object变量是否是(int, int),如果可以,我将使用强制类型转换的变量,因此我尝试了以下代码:

//this one gives the error
public void MyMethodWithIs(object val)
{
    if(val is (int id, int name) pair)
    {
        ConsoleWriteLine($"{pair.id}, {pair.name}");
    }
}

//This one works
public void MyMethodWithAs(object val)
{
    var pair = val as (int id, int name)?;
    if(pair!=null)
    {
        ConsoleWriteLine($"{pair.id}, {pair.name}");
    }
}
Run Code Online (Sandbox Code Playgroud)

MyMethodWithIs方法在编辑器中给出以下错误:

找不到适用于类型的合适的解构实例或扩展方法

我的问题

为什么一个工作正常,而另一个却出现错误呢?我认为它MyMethodWithIs更具可读性,适合用于我的案子,但由于出现错误,我无法使用它。

can*_*on7 17

使用C#8的模式匹配功能,您可以编写以下代码:

if (val is (int id, int name))
{
    Console.WriteLine($"id: {id}; name: {name}");
}
Run Code Online (Sandbox Code Playgroud)

但是,此框idname,令人惊讶。有一个建议对此进行优化

在C#8以下,您可以编写以下代码:

if (val is ValueTuple<int, int> pair)
{
    Console.WriteLine($"id: {pair.Item1}; name: {pair.Item2}");
}
Run Code Online (Sandbox Code Playgroud)

您当然可以使其更加清晰:

if (val is ValueTuple<int, int> pair)
{
    var (id, name) = pair;
    Console.WriteLine($"id: {id}; name: {name}");
}
Run Code Online (Sandbox Code Playgroud)

看起来您也可以内联构造ValueTuple:

if (val is ValueTuple<int, int>(var id, var name))
{
    Console.WriteLine($"id: {id}; name: {name}");
}
Run Code Online (Sandbox Code Playgroud)

...有点恐怖,但似乎合法

我可能期望val is (int, int) pair)可以工作,但是似乎没有人设计这种情况(尚未)。