21

我正在尝试检查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}");
    }
}

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

没有找到适合类型的解构实例或扩展方法

我的问题

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

4

1 回答 1

20

使用 C# 8 的模式匹配功能,您可以这样编写:

if (val is (int id, int name))
{
    Console.WriteLine($"id: {id}; name: {name}");
}

然而这个盒子idname,这是令人惊讶的。有一个优化这个的建议

在 C# 8 以下,你可以这样写:

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

你当然可以让它更清楚一点:

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

看起来您还可以解构内联的 ValueTuple:

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

...这有点可怕,但似乎是合法的。

我可能期望val is (int, int) pair)工作,但似乎没有人设计这个案例(还)。

于 2019-05-12T20:39:56.337 回答