我指的是这里描述的元组文字:https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/#comment-321926
喜欢元组的文字理念。
但是,我预见很多人会查看返回元组中项目的顺序,并想知道我们如何解决这个问题。
例如,将元组中的项目名称作为标识定义方面而不是顺序,是否更有意义?或者有没有办法做到这一点我没有看到?
例如:假设NextEmployee()是一些我没有源代码的库方法,并没有特别详细记录,并假设它向我返回(firstname: “jamie”, lastname: “hince”, id: 102348)
,我说:< / p>
(string lastname, var _, int __) = NextEmployee(); // I only need the last name
编译器会愉快地将firstname分配给lastname,或者对它发出警告或错误。为什么不将姓氏映射到姓氏?
如果我们不必记住元组中的lastname索引,我会看到允许更松散耦合的体系结构,并且可以像这样请求方面“lastname”。
答案 0 :(得分:3)
元组只是一堆变量。作为变量,您可以分配任何可分配给变量类型的值,而不管变量名称。
名称仅作为变量名称的指示。返回值的唯一区别是编译器使用TupleElementNames attribute保留元组元素的名称。
事实上,即使存在名称,编译器也会警告您,如果您不使用相同的名称,通常,这是一个错误,仍然是有效的语法:
(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
{变种{1}} and type names
要声明一个元组来接收方法的返回,你需要声明一个元组变量:
var (lastname, _, __) = NextEmployee();
(string firstname, string lastname, int id) t = NextEmployee();
但似乎您的意图是忽略var t = NextEmployee();
和LastName
值:
id
但是如果你真的写(_, string lastname, _) = NextEmployee(); // declares a lastname variable and ignores firstname and id
,那么你要分配一个名为(string lastname, _, _) = NextEmployee();
的本地字符串变量,其值为返回的字符串“variable”lastname
。
请记住,元组不是实体。它们是一组价值观。如果您使用的库使用元组作为实体,请注意该库可能存在其他错误。
答案 1 :(得分:0)
为什么不呢?好吧,因为底层运行时甚至不知道名称。
编译器必须在编译期间执行此操作。我们在哪里停下来?错别字,大写等等? 在我看来,目前的方式是可以的。
如果您对此主题有所不同,请通过提出问题在github上的官方语言设计存储库中提出您的问题:
https://www.github.com/dotnet/csharplang
Paulo已经很好地解释了技术细节,所以我不打算再重复一遍。