我正在尝试检查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
更具可读性,适合用于我的案子,但由于出现错误,我无法使用它。
答案 0 :(得分:17)
使用C#8的模式匹配功能,您可以编写以下代码:
if (val is (int id, int name))
{
Console.WriteLine($"id: {id}; name: {name}");
}
但是此框id
和name
令人惊讶。有一个proposal to optimize this。
在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}");
}
...有点恐怖,但appears to be legal。
我可能期望val is (int, int) pair)
可以工作,但是似乎没有人设计这种情况(至今)。