Я пытаюсь определить тип, который является Tuple <int, Tuple <int, int>>. У меня есть класс с именем Tile, в котором я определяю такие параметры:

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 сообщает мне это для TId и Id:

Не указан аргумент, соответствующий обязательному формальному параметру 'item1' из 'Tuple< int, Tuple< int, int>>.Tuple(int, Tuple<int, int>)'.

Я не совсем понимаю, что здесь происходит. Нужно ли мне определять этот тип по-другому? Спасибо за помощь!

3
daolm 18 Фев 2016 в 20:17

3 ответа

Лучший ответ

Ваш код быстро запутается и станет выглядеть беспорядочно. Вам лучше определить свойства в своих классах Id и TId вместо наследования от Tuple ...

Если вы действительно хотите использовать кортеж, вам нужно указать параметры для инициализации ваших данных:

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))
        {
        }
    }
}
11
ibiza 18 Фев 2016 в 17:20

Насколько я понимаю ваш вопрос, вы хотите иметь Id и TId не как внутренний класс, а как поле.

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;
}

Также обратите внимание, что вы использовали смешанную лексику в своем вопросе. Взгляните на эту запись MSDN, в которой объясняются различные члены класса.

Если вы хотите, чтобы элементы использовались как параметр , а не как поля , это будет выглядеть следующим образом:

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; }
}
2
Markus Weninger 18 Фев 2016 в 17:42

Ваш класс наследуется от класса, у которого нет конструктора без параметров:

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

Но вы не определяете конструктор для унаследованного класса. Ошибка компилятора сообщает вам, что конструктор без параметров по умолчанию не предоставляет необходимые аргументы конструктору базового класса.

Определите конструктор с этими аргументами:

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)) { }
}
2
David 18 Фев 2016 в 17:24