元组只是一个变量包。作为变量,您可以分配任何可分配给变量类型的值,而不管变量名称如何。
名称仅作为变量名称的指示。返回值的唯一区别是编译器使用TupleElementNames 属性保存元组元素的名称。
事实上,即使存在名称,如果您不使用与通常相同的名称,编译器也会警告您,这是一个错误并且仍然有效的语法:
(string firstname, string lastname, int id) NextEmployee()
=> (apples: "jamie", potatos: "hince", oranges: 102348);
/*
Warning CS8123 The tuple element name 'apples' is ignored because a different name is specified by the target type '(string firstname, string lastname, int id)'.
Warning CS8123 The tuple element name 'potatos' is ignored because a different name is specified by the target type '(string firstname, string lastname, int id)'.
Warning CS8123 The tuple element name 'oranges' is ignored because a different name is specified by the target type '(string firstname, string lastname, int id)'.
*/
您在此处使用的语法:
(string lastname, var _, int __) = NextEmployee();
不是元组声明语法,而是创建LastName
变量、_
变量和__
变量的元组解构语法。
这些都是产生相同结果的等价物:
(var lastname, var _, var __) = NextEmployee(); // or any combination of
变量and type names
var (lastname, _, __) = NextEmployee();
要声明一个元组以接收方法的返回,您需要声明一个元组变量:
(string firstname, string lastname, int id) t = NextEmployee();
var t = NextEmployee();
但似乎您的意图是忽略LastName
andid
值:
(_, string lastname, _) = NextEmployee(); // declares a lastname variable and ignores firstname and id
但是,如果您真的编写(string lastname, _, _) = NextEmployee();
了 ,那么您将分配一个本地字符串变量,该变量以lastname
返回的字符串 "variable" 的值命名firstname
。
请记住,元组不是实体。它们是一组值。如果您使用的库使用元组作为实体,请注意该库可能存在其他问题。