默认情况下,使用C# 7元组时,项目将被命名为Item1
,Item2
等。
我知道你可以为返回的元组项命名。但是你能否在内联代码中做到同样的事情,例如以下示例?
foreach (var item in list1.Zip(list2, (a, b) => (a, b)))
{
// ...
}
在
foreach
的主体中,我希望能够使用比 Item1
和 Item2
更好的方法来访问其中包含 a
和 b
的元组。可以的,通过解构元组:
foreach (var (boo,foo) in list1.Zip(list2, (a, b) => (a, b)))
{
//...
Console.WriteLine($"{boo} {foo}");
}
或者foreach (var item in list1.Zip(list2, (a, b) => (a, b)))
{
//...
var (boo,foo)=item;
Console.WriteLine($"{boo} {foo}");
}
即使在声明元组时命名了字段,您仍需要使用解构语法将它们作为变量访问:foreach (var (boo,foo) in list1.Zip(list2, (a, b) => (boo:a, foo:b)))
{
Console.WriteLine($"{boo} {foo}");
}
如果你想通过名称访问字段而不需要解构元组,则必须在创建元组时为它们命名:
foreach (var item in list1.Zip(list2, (a, b) => (boo:a, foo:b)))
{
Console.WriteLine($"{item.boo} {item.foo}");
}
var t = (a, this.b, y.c, d: 4); // t.a, t.b, t.c 和 t.d 存在
有关更多详细信息,请参见https://github.com/dotnet/csharplang/blob/master/proposals/csharp-7.1/infer-tuple-names.md。
Deconstruct
成员或扩展方法,任何类型都可以用这种方式进行解构。元组非常适合这种情况。你可以为现在没有它们的类型创建扩展解构方法,例如KeyValuePair只需要一个void Deconstruct<TK,TV>(this KeyValuePair,out TK key, out TV value) ...
方法。 - Panagiotis Kanavosref
、out
和ref local
的示例用法:[https://dev59.com/36Lia4cB1Zd3GeqPj3_-#46019408] - Glenn Slayden