C# 使用元组的TRest复合网

C# 使用元组的TRest复合网,c#,list,tuples,C#,List,Tuples,我试图使用元组的最树部分,这样我可以说向元组列表中添加14个字符串 List<Tuple<string, string, string, string, string, string, string, Tuple<string, string, string, string, string, string, string>>> list = new List<Tuple<string, string, string, string, string,

我试图使用元组的最树部分,这样我可以说向元组列表中添加14个字符串

List<Tuple<string, string, string, string, string, string, string, Tuple<string, string, string, string, string, string, string>>> list = new List<Tuple<string, string, string, string, string, string, string, Tuple<string, string, string, string, string, string, string>>>();   

我遇到了一个重载错误,我以前没有尝试过使用它。我是否做了一些根本不正确的事情?

要在元组上使用TRest,必须包含另一个元组,例如,int的16元组是:

Tuple<int, int, int, int, int, int, int, 
    Tuple<int, int, int, int, int, int, int, 
        Tuple<int,int>>> t16;
然后,访问元素8-14:

var x8 = t16.Rest.Item1;
...
var x14 = t16.Rest.Item7;
然后,访问元素15、16:

var x15 = t16.Rest.Rest.Item1;
var x16 = t16.Rest.Rest.Item2;
等等。我有一篇博文,如果你感兴趣的话,可以深入探讨一下

更新:

您的具体错误是因为带有8个类型参数的
Tuple.Create()
设计用于创建八元组,而不是九元组及以上。因此:

Tuple.Create<T1, T2, T3, T4, T5, T6, T7, T8>(...)
Tuple.Create(…)
实际上创造了一个

Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>>
元组
因为你要通过一个考试

Tuple<string, string, string, string, string, string, string>
元组
作为T8,它是在第8个元素内部包装七元组,这不是您所期望的

这就是它抱怨类型不匹配的原因,如果您注意到错误,它将
Tuple
作为T8,它是一个封装在Tuple中的七元组

因此,如果需要隐式键入,您需要为九元组及以上的元组编写一些扩展,或者手工构建它:

list.Add(new Tuple<string, string, string, string, string, string, string, 
    Tuple<string, string, string, string, string, string, string>>(
        test1, test2, test3, test4, test5, test6, test7, list2));
list.Add(新元组)(
测试1、测试2、测试3、测试4、测试5、测试6、测试7、列表2);

这只是大元组令人困惑的众多原因之一

你知道你只是滥用了元组,对吧?除了误用元组?一个元组中有这么多的元素,结构如此复杂……它只会尖叫“我是一个类!”这段代码的味道非常强烈。它描述了如何访问这里:ListOm cheers,我相信我在第一个元组中包含了另一个元组?当声明第一个列表时。不过,我会看看你的博客,让你知道我是如何发现你的错误的。你的错误看起来好像与Create()产生的问题有关,检查……问题是Create()接受一个T8,但自动将其包装在一个元组中,因此,你似乎无法将Tuple.Create()用于你想要的目的。也就是说,带有8个参数的Create()被设计成一个八元组,它的设计目的不是做八元组以外的任何事情。@Paul:只是添加了显式语法(使用
list2
,显然可以使用Tuple。Create用于list2,而不是list1)@Paul:没问题
Tuple
适用于小型集合,并有其他用途,但大多数情况下,最好使用具有有意义属性名称的显式类。
Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>>
Tuple<string, string, string, string, string, string, string>
list.Add(new Tuple<string, string, string, string, string, string, string, 
    Tuple<string, string, string, string, string, string, string>>(
        test1, test2, test3, test4, test5, test6, test7, list2));