如何声明和实例化n元组

本文关键字:实例化 元组 声明 何声明 | 更新日期: 2023-09-27 18:12:59

我已经检查了这里的帖子,没有一个我发现似乎解决了我的具体问题。在发布这篇文章的时候,我误读了MSDN关于n元组的分类,并且看不到我的n元组不工作的明显原因。我第一次尝试创建一个N大小的元组,当我尝试赋值时出现了错误。我想我只是把语法搞错了一点。

我的元组

:

public Tuple<float, float, float, float, float, float, float, 
     Tuple<float, float, float, float, float, float, float, Tuple<float>>> 
     CollisionTuple = new Tuple<float, float, float, float, float, float, 
     float, Tuple<float, float, float, float, float, float, float, Tuple<float>>>
     (0, 0, 0, 0, 0, 0, 0, Tuple<float, float, float, float, float, float, float>
     (0, 0, 0, 0, 0, 0, 0, Tuple<float>(0)));

那么,我的语法哪一部分出错了?在给元组赋值之前的所有内容都不会返回错误。

更新:

如何声明和实例化n元组

我只是overloaded方法,并使用array进行碰撞检测。

你真的很接近了,你只是忘记了几个new s和一个Tuple<float>类型的参数。如此:

public Tuple<float, float, float, float, float, float, float, 
 Tuple<float, float, float, float, float, float, float, Tuple<float>>> 
 CollisionTuple = new Tuple<float, float, float, float, float, float, 
 float, Tuple<float, float, float, float, float, float, float, Tuple<float>>>
 (0, 0, 0, 0, 0, 0, 0, new Tuple<float, float, float, float, float, float, float, Tuple<float>>
 (0, 0, 0, 0, 0, 0, 0, new Tuple<float>(0)));
但是,正如我在评论中提到的,您应该尝试简化它,也许可以通过创建一个新类型来封装这里发生的任何事情。你需要调试这个对象的实例化,这是一个不好的信号。

@dlev的答案正确。但是,我建议为此创建一个新类型,以使您的代码更具可读性:

class CollisionTuple : Tuple<float, float, float, float, float, float, float, 
                         Tuple<float, float, float, float, float, float, float, 
                           Tuple<float>>>
{
    CollisionTuple(float f1, float f2, ..., float f15) 
        : Tuple<(7 type arguments...)>(f1, f2, ..., f7, 
              new Tuple<(7 type arguments again...)>(f8, ..., f14,
                  new Tuple<float>(f15))))
    {
    }
}

这样,你就可以像这样实例化它:

// where the class is used:
CollisionTuple collTup = new CollisionTuple(0, 0, (etc...), 0);

如果你知道你经常要用零来初始化它,你甚至可以创建一个默认构造函数来为你做这件事:

// inside the class, with the other constructor still defined:
CollisionTuple() : CollisionTuple(0, 0, (etc...), 0) { };

使使用更容易:

var collisionTuple = new CollisionTuple();

瞧!所有那些混乱的泛型和计数参数都消失了(或者至少被掩盖了…),您可以专注于代码的重要部分=)