Note:这些限制尚未在 Preview 4 中实现。
元组是值类型的,它们的元素是公开的,可变的。他们有值相等,如果所有的元素都是成对相等的(并且具有相同的哈希值),那么这两个元组也是相等的(并且具有相同的哈希值)。
这使得在需要返回多个值的情况下,元组会非常有用。举例来说,如果你需要多个 key 值的字典,使用元组作为你的 key 值,一切会非常顺利。如果你需要在每个位置都具有多个值的列表,使用元组进行列表搜索,会工作的很好。
Note:元组依赖于一组基本类型,却不包括在 Preview 4 中。为了使该特性工作,你可以通过 NuGet 获取它们:
•右键单击 Solution Explorer 中的项目,然后选择“管理的NuGet包......”
•选择“Browse”选项卡,选中“Include prerelease”,选择“nuget.org”作为“Package source”
•搜索“System.ValueTuple”并安装它。
解构
消耗元组的另一种方法是将解构它们。一个解构声明是一个将元组(或其他值)分割成部分并单独分配到新变量的语法:
(string first, string middle, string last) = LookupName(id1); // deconstructing declaration
WriteLine($"found {first} {last}.");
在解构声明中,您可以使用 var 来声明单独的变量:
(var first, var middle, var last) = LookupName(id1); // var inside
或者将一个单独的 var 作为一个缩写放入圆括号外面:
var (first, middle, last) = LookupName(id1); // var outside
你也可以使用解构任务来解构成现有的变量
(first, middle, last) = LookupName(id2); // deconstructing assignment
解构不只是应用于元组。任何的类型都可以被解构,只要它具有(实例或扩展)的解构方法:
public void Deconstruct(out T1 x1, ..., out Tn xn) { ... }
输出参数构成了解构结果中的值。
(为什么它使用了参数,而不是返回一个元组?这是为了让你针对不同的值拥有多个重载)。
class Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y) { X = x; Y = y; }
public void Deconstruct(out int x, out int y) { x = X; y = Y; }
}
(var myX, var myY) = GetPoint(); // calls Deconstruct(out myX, out myY);
这是一种常见的模式,以一种对称的方式包含了构建和解构。
对于输出变量,我们计划在解构中加入通配符,来化简你不关心的变量:
(var myX, *) = GetPoint(); // I only care about myX
Note:通配符是否会出现在C#7.0中,这仍是未知数。










