将 is 运算符与值类型元组一起使用会出错
Using `is` operator with value type tuples gives error
我正在尝试检查 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
方法在编辑器中给出以下错误:
No suitable deconstruct instance or extension method was found for type
我的问题
为什么一个工作正常而另一个却完全出错?我认为 MyMethodWithIs
更具可读性,更适合用于我的案例,但由于出现错误我无法使用它。
使用 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)
可以工作,但似乎还没有人设计过这种情况。
我正在尝试检查 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
方法在编辑器中给出以下错误:
No suitable deconstruct instance or extension method was found for type
我的问题
为什么一个工作正常而另一个却完全出错?我认为 MyMethodWithIs
更具可读性,更适合用于我的案例,但由于出现错误我无法使用它。
使用 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)
可以工作,但似乎还没有人设计过这种情况。