Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
WolfGrin
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 4
#1

Использование кортежей (Tuple) в качестве параметров: Create or new? - C#

16.05.2016, 23:19. Просмотров 894. Ответов 4
Метки нет (Все метки)

Всем привет! Относительно недавно начал изучать азы С#, дойдя до кортежей столкнулся с дилеммой на которую не смог найти вразумительного ответа. Помогите разобраться...

При передаче в качестве параметров методу или возвращаемого значения, кортежей менее 8-ми переменных проблем нет, можно использовать как Tuple.Create() (без явного указания типов) так и new Tuple<T1, T2, ...>, но при добавлении 8-мой переменной типа Tuple использование Tuple.Create приводит к ошибке:

Error CS1503 Argument 1: cannot convert from 'System.Tuple<int, int, int, int, int, int, int, System.Tuple<System.Tuple<int, int>>>' to 'System.Tuple<int, int, int, int, int, int, int, System.Tuple<int, int>>'
C#
1
2
3
4
5
6
7
8
9
10
...
    var tup = Tuple.Create(8, 9);
    var tup2 = Tuple.Create(1, 2, 3, 4, 5, 6, 7, tup);
 
    Func(tup2);
 }
 static void Func (Tuple<int, int, int, int, int, int, int, Tuple<int, int>> buf)
 {
 
 }
Использование 'new Tuple' решает конечно проблему, но все таки хотелось бы разобраться, возможно ли использовать 'Tuple.Create' при передаче/возврате кортежей, содержащих более 7-ми переменных. Ведь именно для больших кортежей трудозатратно объявлять все типы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2016, 23:19
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Использование кортежей (Tuple) в качестве параметров: Create or new? (C#):

Использование делегатов в качестве параметров функции - C#
Реализовать метод, вычисляющий значение функции с заданным диапазоном (интервалом для вычислений) и заданным шагом. Виды функций,...

Использование делегатов в качестве параметров функции - C#
Использование делегатов в качестве параметров функции. Реализовать метод, вычисляющий значение функции с заданным диапазоном (интервалом...

Использование делегатов в качестве параметров функции - C#
Реализовать метод, вычисляющий значение функции с заданным диапазоном (интервалом для вычислений) и заданным шагом. Виды функций,...

Использование делегатов в качестве параметров функции - C#
Реализовать метод, вычисляющий значение функции с заданным диапазоном (интервалом для вычислений) и заданным шагом. Виды функций,...

Передать в качестве параметров неограниченное число массивов - C#
Ребят подскажите,а то что никак не пойму. Мне надо чтобы в параметры метода попадало какое угодно количество одномерных массивов,это...

Передача объектов в качестве параметров другому объекту - C#
Добрый день, подскажите как правильно передать объекты в качестве параметров другому объекту чтобы при этом еще и соблюсти инкапсуляцию ...

4
Hares
39 / 36 / 16
Регистрация: 08.05.2016
Сообщений: 119
Завершенные тесты: 1
17.05.2016, 08:58 #2
Tuple.Create не имеет перегрузок, содержащих более 8 аргументов (источник).

В принципе, вы можете создать структуру непосредственно под вас, или написать метод, который бы создавал нужный вам tuple, например, Tuple<int, int, int, int, int, int, int, Tuple<int, int>> CreateTuple(int a1, int a2, ... int a8, int a9)
0
Миниатюры
Использование кортежей (Tuple) в качестве параметров: Create or new?  
WolfGrin
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 4
18.05.2016, 01:04  [ТС] #3
Спасибо за ответ. Но я не испытываю трудности при создании кортежа содержащего более 8-ми переменных. Проблема заключается в передаче или возврате такого кортежа из метода, при условии использования Tuple.Create()
0
Usaga
Эксперт .NET
3414 / 2866 / 503
Регистрация: 21.01.2016
Сообщений: 11,300
Завершенные тесты: 2
18.05.2016, 08:38 #4
WolfGrin, использование кортежей - прямой путь к говнокоду. В этом легко убедиться глянув на сигнатуру твоего метода: static void Func (Tuple<int, int, int, int, int, int, int, Tuple<int, int>> buf). Что означает третий слева Int? Поди, разберись!

Если нужно передавать много данных определи класс с публичными свойствами и передавай его. Ограничения на количество свойств нет. Можно завести хоть сто.
1
kolorotur
Эксперт .NET
9856 / 8235 / 1383
Регистрация: 17.09.2011
Сообщений: 14,150
18.05.2016, 10:40 #5
Цитата Сообщение от WolfGrin Посмотреть сообщение
Проблема заключается в передаче или возврате такого кортежа из метода, при условии использования Tuple.Create()
Посмотрите на тип возвращаемого значения при использовании метода Create с 8-ю параметрами:
C#
1
Tuple<T1,T2,T3,T4,T5,T6,T7,Tuple<T8>>
Обратите внимание, что последний параметр оборачивается в кортеж из одного элемента, то есть если вы вызовете метод Create с аргументами (1, 2, 3, 4, 5, 6, 7, 8), то в результате получите кортеж, где Item8 является не восьмеркой, а Tuple<int>(8).
Восьмым аргументом вы передаете Tuple<int, int>, метод Create старательно оборачивает его в единичный кортеж и в итоге Item8 — это Tuple<Tuple<int, int>>.
Почему этот метод оборачивает последний параметр в единичный кортеж — не знаю, возможно сделано для какой-то совместимости. А может разработчик и сам запутался в этих типах (что не удивительно) и баг пошел в релиз.

Вы можете изменить сигнатуру метода Func таким образом, чтобы последний параметр кортежа имел соответствующий тип.
Как вариант, можно использовать только седьмую перегрузку метода Create, передавая последним, седьмым аргументом кортеж уже из трех элементов: Tuple<int, int, int>.

Но лучший вариант, как посоветовал выше товарищ Usaga — создать тип с необходимыми полями или в крайнем случае просто передавать значения как параметры, возможно даже используя params.
0
18.05.2016, 10:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2016, 10:40
Привет! Вот еще темы с ответами:

Использование символов в качестве операторов - C#
char c = { '+','-','*','/'}; int calculate(int i) { int sum = 1 ( c/*как определить здесь оператор? */ ) 2; } Как...

Ввод значений в консоль и использование введенного в качестве переменной - C#
Как вводить значения и запоминать их в переменные? Нужно ввести 3 значения и затем сравнивать. И спрошу в этой же теме. Как...

Использование SchTasks в качестве планировщика внутри своей программы - C#
Привет! Скажите, увидел любопытную вещь для реализации планировщика заданий. SchTasks, вроде понятным языком изложено. Но вопрос,...

Использование сокета в качестве сервера или клиента по ситуации - C#
В большинстве клиент-серверных приложений сначала запускают сервер , затем клиентов. Но захотелось автоматизации , те автоматического...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru