基本用法
(double, int) t1 = (4.5, 3);
double sum = t1.Item1;
int count = t1.Item2;
字段名称
可以在元组初始化表达式(上面的 (4.5, 3))或元组类型的定义(上面的 (double, int))中显示指定元组字段名称,例:
var t = (Sum: 4.5, Count: 3);
double sum1 = t.Sum;
int count1 = t.Count;(double Sum, int Count) d = (4.5, 3);
double sum2 = d.Sum;
int count2 = d.Count;
未显式指定名称时,可以根据元组初始化表达式中变量名称推断出元组字段名称,称为“元组投影初始值设定项”,例:
string str = "Hello";
var t = (str, str.Length); // 变量名、字段名或实例属性名等
Console.WriteLine($"The length of [{t.str}] is {t.Length}.");
说明:
-
如果推断的名称是元组类型的成员名称,则不会被投影,例:
// 编译异常:CS8126 Tuple element name 'ToString' is disallowed at any position. var t1 = (Num: 123, ToString: "123");// 允许正常编译,无法通过 t2.Item3 访问第一个元素 var t2 = (MyClass.Item3, 1); class MyClass {public static string Item3 = ""; } -
如果推断的名称重复,则不会被投影,例:
string s1 = "foo"; string s2 = "bar"; // 允许正常编译,无法通过 t.Length 访问任何一个元素 var t = (s1.Length, s2.Length); -
即使发生了投影,也允许使用元组字段默认名称,例:
var t = (Sum: 4.5, Count: 3); double sum = t.Item1; int count = t.Item2;
赋值
支持两个元组直接赋值,前提条件:
- 两个元组元素数量相同
- 两个元组对应元素类型相同,或右侧到左侧支持隐式转换
元组赋值忽略元组的字段名称,也就是说,即使字段名称不同也允许赋值,被赋值后字段名称不会被修改
析构
允许使用赋值运算符 = 在单独的变量中析构元组实例,例:
var t = ("post office", 3.6);
// 声明隐式类型化变量
var (destination, distance) = t;var t = ("post office", 3.6);
// 显式声明每个变量的类型
(string destination, double distance) = t;var t = ("post office", 3.6);
// 显式声明一些类型,隐式声明其他类型
(var destination, double distance) = t;var destination = string.Empty;
var distance = 0.0;
var t = ("post office", 3.6);
// 使用现有变量
(destination, distance) = t;
比较
元组类型支持 == 和 != 运算符,按顺序对两个元组中的元素依次比较,前提条件:
- 两个元组元素数量相同
- 两个元组对应元素可比较(使用
==和!=运算符)
官方文档
https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/value-tuples
