C# 中的元组定义

Tuple definition in c#

我正在尝试定义一个 Tuple <int, Tuple <int, int>> 类型。我所拥有的是一个名为 Tile 的 class,我在其中定义了一些这样的参数:

public class Tile
{
    public readonly int producerId;
    public readonly int level;
    public class Id : Tuple<int, Tuple<int, int>>
    {
    }
    public class TId : Tuple<int, Tuple<int, int>>
    {
    }
}

问题是 VS 告诉我 TIdId:

There is no argument given that corresponds to the required formal parameter 'item1' of 'Tuple< int, Tuple< int, int>>.Tuple(int, Tuple<int, int>)'.

我不完全明白这里发生了什么。我必须以不同的方式定义这种类型吗?感谢您的帮助!

您的代码很快就会变得混乱,看起来一团糟。您最好在 类 IdTId 中定义属性,而不是从元组继承...

如果你真的想用元组的方式,你需要提供参数来初始化你的数据:

public class Tile
{
    public readonly int producerId;
    public readonly int level;
    public class Id : Tuple<int, Tuple<int, int>>
    {
        public Id(int value1, int subvalue1, int subvalue2)
            : base(value1, new Tuple<int, int>(subvalue1, subvalue2))
        {
        }
    }
    public class TId : Tuple<int, Tuple<int, int>>
    {
        public TId(int value1, int subvalue1, int subvalue2)
            : base(value1, new Tuple<int, int>(subvalue1, subvalue2))
        {
        }
    }
}

您的 class 继承自没有无参数构造函数的对象:

public class Id : Tuple<int, Tuple<int, int>>
{
}

但是您没有为继承的 class 定义构造函数。编译器错误告诉您默认的无参数构造函数没有向基础 class' 构造函数提供必要的参数。

使用这些参数定义构造函数:

public class Id : Tuple<int, Tuple<int, int>>
{
    public Id(int first, Tuple<int, int> second) : base(first, second) { }
}

或者,如果你想要一个无参数的,定义默认参数:

public class Id : Tuple<int, Tuple<int, int>>
{
    public Id() : base(0, new Tuple<int, int>(0, 0)) { }
}

据我了解您的问题,您不想将 IdTId 作为内部 class,而是作为一个字段。

public class Tile
{
    public readonly int producerId;
    public readonly int level;
    public Tuple<int, Tuple<int, int>> Id;
    public Tuple<int, Tuple<int, int>> TId;
}

另请注意,您在问题中使用了混合词汇。请查看 at this MSDN entry 对不同 class 成员的解释。

如果您想让成员作为 参数,而不是 字段,它看起来如下:

public class Tile
{
    public readonly int ProducerId { get; set; }
    public readonly int Level { get; set; }
    public Tuple<int, Tuple<int, int>> Id { get; set; }
    public Tuple<int, Tuple<int, int>> TId { get; set; }
}