2016-02-18 3 views
2

Я пытаюсь определить тип, который является Tuple <int, Tuple <int, int>>. Что у меня есть, это класс с именем Tile, где я определить некоторые параметры, как это:Определение кортежа в C#

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>)'.

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

+1

Вы действительно намерены сделать 'Id' и' TId' внутренних классов ' Tile'? Основываясь на их именах, я должен задаться вопросом, могли ли вы означать, что они являются свойствами 'Tile'. Предполагая это _is_, что вы хотите сделать, проблема в том, что 'Id' и' TId' не вызывают конструктор базового класса. –

+0

FYI есть ['Tuple '] (https://msdn.microsoft.com/en-us/library/dd387150 (v = vs.110) .aspx) класс, который вы могли бы использовать вместо вложенности. – juharr

+1

Вы также должны получить свой словарный запас. У вас нет _parameter_ в вашем классе выше, но _fields_. [Эта ссылка] (https://msdn.microsoft.com/en-us/library/ms173113.aspx) может дать вам обзор членов класса. –

ответ

9

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

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

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)) 
     { 
     } 
    } 
} 
+1

Согласитесь с рекомендацией не распространять Tuple <> для удобства чтения –

2

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

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)) { } 
} 
+1

coud даже использовать default (int) вместо 0s – ibiza

2

Как я понимаю ваш вопрос, вы не хотите есть 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; 
} 

отметить также, что вы использовали смешанный словарный запас в вашем вопросе. Пожалуйста, посмотрите at this MSDN entry, объясняя разные члены класса.

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

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; } 
} 
Смежные вопросы