Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/48: Рейтинг темы: голосов - 48, средняя оценка - 4.96
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5

Изменение шаблона вызывает ошибку "Cannot implicitly convert type 'ExamList.Form1.SimpleElm' to 'T'"

15.04.2012, 10:30. Показов 10074. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Возникла проблема. Имеется рабочий код вида
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
public class SimpleElm
        {
            public string value;
            public SimpleElm next;
            public SimpleElm(string value)
            {
                this.value = value;
                this.next = null;
            }
        }
 
        public static class List
        {
 
           ...
 
static public bool Delete (ref SimpleElm firstElm, int n)
            {
                SimpleElm currentElm = firstElm;
                if (currentElm == null) return false;
                if (n == 1)
                {
                    firstElm = firstElm.next;
                    return true;
                }
                for (int i = 1; i < n - 1; i++)
                {
                    if (currentElm.next == null) return false;
                    currentElm = currentElm.next;
                }
                if (currentElm.next == null) return false;
                currentElm.next = currentElm.next.next;
                return true;
            }
        }
Но если попробовать применить шаблон и заменить, то начинает ругаться
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static public bool Delete<T> (ref T firstElm, int n) where T: SimpleElm
            {
                T currentElm = firstElm;
                if (currentElm == null) return false;
                if (n == 1)
                {
                    firstElm = firstElm.next;
                    return true;
                }
                for (int i = 1; i < n - 1; i++)
                {
                    if (currentElm.next == null) return false;
                    currentElm = currentElm.next;
                }
                if (currentElm.next == null) return false;
                currentElm.next = currentElm.next.next;
                return true;
            }
Cannot implicitly convert type 'ExamList.Form1.SimpleElm' to 'T'. An explicit conversion exists (are you missing a cast?)
Как это исправить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.04.2012, 10:30
Ответы с готовыми решениями:

Cannot implicitly convert type
Cannot implicitly convert type System.Drawing.Image to System.Drawing.Bitmap. Как исправить? Ошибка в этой строке: oldimage =...

CS0029 Cannot implicitly convert type
Пишу Roblox Exploit (чит на игру) делаю всё как на видео, почти тут 2 одинаковых cs0029 ошибки private void...

Cannot implicitly convert type 'string' to 'bool'
bool res = !a.Any(x =&gt; reporting.Where(r =&gt; r.File as string ?? r.File?.Name).Contains(x)); Что я делаю не так?

9
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.04.2012, 11:00
У вас обычный пример присвоения ссылке на наследуемый класс значения базового класса. По умолчанию компилятор не разрешает это делать, потому приходится делать явное приведение:
C#
1
2
3
4
object obj = "Hello";
string str = obj; // Cannot implicitly convert type 'System.Object' to 'System.String'. An explicit conversion exists (are you missing a cast?)
 
string str = (string)obj; // ok, если obj ссылается на строку. В противном случае - исключение в рантайме.
Можете делать явное приведение, но если класс SimpleElm будет наследоваться, у вас могут возникнуть проблемы.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.04.2012, 11:09  [ТС]
kolorotur, дело в том, что у меня будет еще один класс, для них обоих должно выполнятся удаление. То есть
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class SimpleElm
        {
            public string value;
            public SimpleElm next;
            public SimpleElm(string value)
            {
                this.value = value;
                this.next = null;
            }
        }
public class ComplexElm
        {
            public string value;
            public ComplexElm next;
            public SimpleElm details;        
            public ComplexElm(string value)
            {
                this.value = value;
                this.next = null;
                this.details = null;
            }
        }
И для них должен выполнятся один и тот же код удаления с точностью до класса.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.04.2012, 11:13
Цитата Сообщение от Psilon Посмотреть сообщение
public class SimpleElm
public class ComplexElm
То есть у вас эти два класса не связаны наследованием?
А как же вы тогда будете делать обобщенный метод, в котором происходит доступ к вполне конкретным членам класса?
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.04.2012, 11:23  [ТС]
kolorotur, да я думал связать, но почему-то решил, что не стоит этого делать. А если так сделать, то какие есть варианты? А то я вчера несколько часов парился, компилятор все ругался на приведение типов. В итоге плюнул и решил до сегодня отложить. Смысл в чем. У меня должна получиться такая картина. То есть next в разных классах является указателем на сам класс, а значит он для них разный (next simpl'а указывает на SimpleElm, а next Complex'а соответственно на ComplexElm)
Миниатюры
Изменение шаблона вызывает ошибку "Cannot implicitly convert type 'ExamList.Form1.SimpleElm' to 'T'"  
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.04.2012, 11:42
Цитата Сообщение от Psilon Посмотреть сообщение
next simpl'а указывает на SimpleElm, а next Complex'а соответственно на ComplexElm
Получается, что в связном списке элемент типа SimpleElm не может стоять после ComplexElm, так как ссылка next класса ComplexElm не может указывать на SimpleElm. Обратное истинно и для SimpleElm. То есть связный список может быть только монотонным, включающим элементы либо одного, либо другого типа.
"Расцепляя" классы, вы хотели добиться именно такого функционала?

Правда, сразу же встает вопрос: а какого типа будет переменная head в классе List?
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.04.2012, 11:48  [ТС]
kolorotur, да, именно, структура должна быть гомогенная относительно указателя next. А Head в классе List я хотел делать таким, какой параметр передается, то есть определять передаваемый тип на этапе выполнения, а не компиляции.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.04.2012, 11:52
Тогда почему бы не сделать тип List обобщенным, сам класс Element (или Node) скрытым типом, а в обобщение передавать тот тип данных, который вы собираетесь хранить в списке?
В этом случае вы и разделите реализацию коллекции от хранящихся в них элементах, получите гомогенность и избавитесь от плясок с разными типами, т.к. собственно элемент связного списка не будет никак зависеть от хранящихся в нем данных.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.04.2012, 11:58  [ТС]
kolorotur, а можно поподробнее? Просто я c# (да и сам C-синтаксис) только начал изучать, причем самостоятельно, поэтому с трудом улавливаю о чем вы.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.04.2012, 14:03
Что-то вроде такого:
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
class List<T>
{
    class Node
    {
        public T value { get; set; }
        public Node Next { get; set; }
 
        public Node(T value)
        {
            this.value = value;
        }
    }
 
    private Node Head { get; set; }
 
    public void Add(T item)
    {
        if (Head == null)
            Head = new Node(item);
        else
        {
            ...
        }
    }
}
Класс Node в данном случае служит контейнером для данных.
Внешние классы с ним пересекаться не будут никак - это не их дело, как связный список реализован внутри. Инкапсуляция и все такое.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.04.2012, 14:03
Помогаю со студенческими работами здесь

Cannot implicitly convert type 'float' to 'string'
клаcс class Train { public string Adress; public int Rooms; public float Square; ...

Cannot implicitly convert type 'int' to 'OreMiner'
Такая проблема, у меня два скрипта Первый скрипт using UnityEngine.EventSystems; using UnityEngine; using UnityEngine.UI; ...

Cannot implicitly convert type 'void' to 'bool'
Писал код по видеоролики и заменил управление на кнопки в UI. Выдалась ошибка :Assets\Attack.cs(20,13): error CS0029: Cannot implicitly...

Cannot implicitly convert type 'int' to 'bool'
Как бороться с несовместимостью двух типов? d задавать как bool не вариант, т.к. там значения только t и f, как правильно сравнивать в if? ...

Cannot implicitly convert type 'double' to 'decimal'
Доброго времени суток, помогите плиз. Сделал переменные duble: double cRe = -0.70176, cIm = -0.3842; Дальше сделал...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru