Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
0 / 0 / 0
Регистрация: 08.11.2019
Сообщений: 18

Применение параметризированных типов

08.11.2019, 14:44. Показов 5462. Ответов 10
Метки нет (Все метки)

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

Есть такая задача:

В системе программирования Microsoft Visual Studio создайте консольное приложение на языке C#.
В этом приложении создайте параметризированный тип с двумя параметрами, определяющий метод Sum2 для сложения двух значений любых числовых типов.
Создайте класс с методом Main, в котором вызовите метод Sum2 с различными значениями параметров:
1. с целочисленными значениями
2. с вещественными значениями
3. со значениями с фиксированной точкой

Решение:

1. я создал новый параметризованный тип:


2. Создал метод, который суммирует 2 значения:


3. Создал объекты:


Поскольку у меня входные данные разных типов, мне нужно в методе указать какой-то универсальный тип. Я не знаю как это делается.

Код моей программы ниже. Такой вид выдает ошибку"Невозможно применить + к оперетанду типа data_type<type1, type2>"

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
 
namespace Zadanie_1
{
    class data_type<type1, type2> { 
        public type1 a; 
        public type2 b;
 
    }
    class Program
    {
        static void Main(string[] args)
        {
 
            data_type<int, int> k1  = new data_type<int, int>();
            data_type<float, float> a1 = new data_type<float, float>();
            data_type<decimal, decimal> b1 = new data_type<decimal, decimal>();
 
            k1.a = 1;
            k1.b = 6;
            Sum2(k1, k1);
 
           /* a1.a = 12.345F;
            a1.b = 2.456F;
            Sum2(a1, a1);*/
 
            b1.a = 300.123m;
            b1.b = 1.54334m;
 
            
        }
 
        static void Sum2<type1, type2>(data_type<type1, type2> a, data_type<type1, type2> b)
        {
           
            float Sum = a + b;
 
            Console.WriteLine(Sum);
            Console.ReadKey();
        }
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.11.2019, 14:44
Ответы с готовыми решениями:

Применение обнуляемых типов в C#
Всем добрый вечер! На данный момент изучаю сей прекрасный язык и остановился на главе, посвящённой обнуляемому типу. Некоторые моменты...

Применение null-совместимых типов, проверка корня
Задание звучит так: Разработать программу, в которой определена функция вычисления квадратного корня, которая возвращает null, если корень...

Сравнение параметризированных типов
Всем привет! У меня есть параметризированный класс, в котором есть метод, принимающий на вход две переменные с неизвестным типом. Я...

10
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
08.11.2019, 15:53
Barboss19, типы меняйте как вам удобно)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System;
 
namespace Zadanie_1
{
    class MyGenerics<TYPE1, TYPE2>
    {
        // Поля
        private TYPE1 variable1;
        private TYPE2 variable2;
 
        // Конструктор.
        public MyGenerics(TYPE1 argument1, TYPE2 argument2)
        {
            this.variable1 = argument1;
            this.variable2 = argument2;
        }
 
        // Свойства.
        public TYPE1 Variable1
        {
            get { return this.variable1; }
            set { this.variable1 = value; }
        }
 
        public TYPE2 Variable2
        {
            get { return this.variable2; }
            set { this.variable2 = value; }
        }
    }
 
    class Program
    {
        static void Main()
        {
            MyGenerics<int, int> instance1 = new MyGenerics<int, int>(1, 2);
            Console.WriteLine(instance1.Variable1 + instance1.Variable2);
 
            MyGenerics<float, float> instance2 = new MyGenerics<float, float>(3.1f, 1.63f);
            Console.WriteLine(instance2.Variable1 + instance2.Variable2);
 
            MyGenerics<decimal, decimal> instance3 = new MyGenerics<decimal, decimal>(5.1234m, 3.141592m);
            Console.WriteLine(instance3.Variable1 + instance3.Variable2);
 
            // Delay.
            Console.ReadKey();
        }
    }
}
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
08.11.2019, 16:03
Цитата Сообщение от Barboss19 Посмотреть сообщение
Код моей программы ниже. Такой вид выдает ошибку"Невозможно применить + к оперетанду типа data_type<type1, type2>"
Для возможности применения оператора к некоторому типу нужно, чтобы реально существовал такой оператор. У Вас в коде оператора + нет для типа data_type<,>.
0
628 / 392 / 135
Регистрация: 06.03.2017
Сообщений: 1,469
08.11.2019, 16:06
Когда вы научитесь нормально оформлять свой код. Это ведь читать совершенно невозможно. Приходится копировать в студию и там смотреть
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
08.11.2019, 16:17
Цитата Сообщение от Barboss19 Посмотреть сообщение
В этом приложении создайте параметризированный тип с двумя параметрами, определяющий метод Sum2 для сложения двух значений любых числовых типов.
Должен заметить, что при отсутствии ограничений к типам-параметрам data_type<,> неизвестны те операции, которые к ним применимы, точнее:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
internal static class Program
{
    public class SumClass<T, T1>
    {
        public T A { get; }
 
        public T1 B { get; }
 
        public SumClass(T a, T1 b)
        {
            A = a;
            B = b;
        }
 
        // Складывать экземпляры SumClass<T, T1> невозможно.
    }
 
    public static void Main()
    {
    }
}
Второе замечание - неизвестен тип возвращаемый тип самой операции сложения для произвольных типов.
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,149
Записей в блоге: 43
08.11.2019, 18:12
Цитата Сообщение от Barboss19 Посмотреть сообщение
В этом приложении создайте параметризированный тип с двумя параметрами, определяющий метод Sum2 для сложения двух значений любых числовых типов.
Насколько я могу судить, "тип, определяющий метод" означает, что надо создать тип и в этом типе оперделить этот метод. И метод должен складывать не экземпляры вновь созданного типа, а числовые типы. Как сделать один метод, который может складывать все числовые типы в языке C# - я не в курсе, разве что для каждого числового типа написать отдельную перегрузку метода.

Добавлено через 7 минут
Кстати, что делать с параметрами типа, в задании не указано. Вообще, задание странное, интересно было бы посмотреть как его решил бы тот, кто его придумал. ))
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
08.11.2019, 19:09
Цитата Сообщение от diadiavova Посмотреть сообщение
Как сделать один метод, который может складывать все числовые типы в языке C# - я не в курсе,
Разве что через IConvertible:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Program
    {
        static void Main(string[] args)
        {
            var operations = new BinaryOperations();
            var integerResult = operations.Sum<int, int>(10, 20);
 
            var doubleResult = operations.Sum<double, double>(20, 20);
 
 
            Console.WriteLine(integerResult);
            Console.WriteLine(doubleResult);
 
            Console.ReadKey(true);
        }
    }
 
 
    class BinaryOperations
    {
        public IConvertible Sum<TOp, TOp2>(TOp leftOperand, TOp2 rightOperand) 
                        where TOp : IConvertible
            where TOp2 : IConvertible
        {
            
            var result = (leftOperand.ToDouble(CultureInfo.InvariantCulture) +
                    rightOperand.ToDouble(CultureInfo.InvariantCulture));
 
            Debug.WriteLine(result.GetType());
            return result;
        }
    }
Добавлено через 1 минуту
Правда приводит к double все, во всяком случае складывает.

Добавлено через 4 минуты
Осталось только решить как привести обратно к одному из параметров типа. Проверки в рантайме (GetType), мне кажется, уже грязное решение.
1
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,149
Записей в блоге: 43
09.11.2019, 16:47
Цитата Сообщение от IamRain Посмотреть сообщение
Разве что через IConvertible:
А что это дает? Можно с таким же успехом и objbject возвращать. Ну и в чем тут выгода от использования джинериков? Обычно они используются для контроля типов и для того, чтобы избежать всей этой свистопляски с проверкой типов и конверсией в рантайме, а тут в рантайме будут создаваться разные версии этого метода, но при этом у всех у них будет совершенно одинаковый код. То есть на разрешение параметров типов будут затрачены какие-то ресурсы, а выгоды это не даст никакой. Если хотя бы использовать один параметр типа для обоих параметров метода и возвращаемого значения, то хотя бы частичный контроль типов был бы, но если надо, чтобы метод складывал и разнотипные аргументы, то это такое себе решение. Тем более, что дабл точно не является всеобъемлющим типом, по крайней мере если в него конвертировать Decimal или BigInteger (а скорее всего также и long и ulong) то это будет сужающее преобразование, то есть возможна потеря данных.
Цитата Сообщение от IamRain Посмотреть сообщение
во всяком случае складывает.
Тогда уж лучше сделать так
C#
1
2
3
4
        static dynamic Add(dynamic x, dynamic y)
        {
            return x + y;
        }
И складывать будет и оптимальное преобразование само подберет. Хотя что можно подобрать при сложении бигинтегер и децимал - я не в курсе ))
Цитата Сообщение от IamRain Посмотреть сообщение
Осталось только решить как привести обратно к одному из параметров типа.
Ну третий джинерик параметр задай ))

Добавлено через 10 минут
Не, если одному из существующих параметров типа, то можно просто типа (Top)expression, с джинериками это тоже работает, а вот если надо, чтобы возвращало что-то третье, то тут без еще одного параметра не обойтись
1
0 / 0 / 0
Регистрация: 08.11.2019
Сообщений: 18
14.11.2019, 19:01  [ТС]
Здравствуйте! Спасибо за ответ! Такое решение не подходит. Вот, что ответили по этому поводу:

"В задании требуется вызвать метод Sum2 с различными значениями параметров.
Следовательно у вас должен быть метод член класса Sum2, для которого вы можете передавать различные типы суммируемых значений."

Необходимо создать универсальный тип
0
880 / 559 / 291
Регистрация: 21.11.2012
Сообщений: 1,554
14.11.2019, 19:05
Barboss19,

может вам нужно перегрузить метод sum2?

т.е.
C#
1
2
3
4
5
6
7
8
public double sum2 (double value1, double value2)
{
     return value1 + value2;
}
public int sum2 (int value1, int value2)
{
     return value1 + value2;
}
0
0 / 0 / 0
Регистрация: 08.11.2019
Сообщений: 18
14.11.2019, 19:08  [ТС]
Я не знаю. Начал изучать программирование в целом чуть больше месяца назад, пытаюсь разобраться
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.11.2019, 19:08
Помогаю со студенческими работами здесь

Применение типов
Пытаюсь перейти от Prolog к Haskel. Надо сделать вычисление арифметического выражения. Пишу рекурсивную программу, аналогичную...

Применение RAW типов
Добрый день ! В каких случаях надо применять RAW типы ? За пример буду благодарен !

Применение is_same для списка типов
Итак, std::is_same может сравнить только два типа. Написал велосипед, который сравнивает первый тип со всеми остальными. Собственно,...

Наследование параметризированных методов в интерфейсах(о2)
Доброго времени суток! Решил заняться чем-то полезным пострадать фигней и немного поиграться с интерфейсами и параметризацией. При...

Создание параметризированных запросов: Неправильный синтаксис около конструкции
Доброго всем времени суток. Создал три параметризированых запроса UPDATE, INSERT и DELETE, ISERT работает нормально, а вот два остальных не...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru