Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22

Не удается неявно преобразовать тип "UnsafeStack.Node" в "UnsafeStack.Node*" - как исправить?

19.02.2019, 10:11. Показов 2827. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Узел:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace UnsafeStack
{
    public unsafe struct Node
    {
        public int value;
        public Node* next;
 
        public Node(int value, Node* next)
        {
            this.value = value;
            this.next = next;
        }
    }
}
Стек:
C#
1
2
3
4
5
6
7
8
9
namespace UnsafeStack
{
    public unsafe struct Stack
    {
        private Node* head;
 
        public void Push(int value) => head = new Node(value, head); // На что заменить?
    }
}
Добавлено через 5 часов 0 минут
Вопрос актуален.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.02.2019, 10:11
Ответы с готовыми решениями:

Как исправить эту ошибку: Не удается неявно преобразовать тип "double" в "bool"
Как исправить эту ошибку: Не удается неявно преобразовать тип "double" в "bool". class Program { static void...

Как исправить ошибку 'Не удается неявно преобразовать тип "System.Collections.Generic.IEnumerable<string>" в "string"'?
Не удается неявно преобразовать тип &quot;System.Collections.Generic.IEnumerable&lt;string&gt;&quot; в &quot;string&quot;. textBox2.Text =...

Не удается неявно преобразовать тип double в тип int
class Program { static void Main(string args) { double k = 0; Random r = new...

4
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
19.02.2019, 10:23
Лучший ответ Сообщение было отмечено Соколиный глаз как решение

Решение

Соколиный глаз,
Бррр.... что это вы вообще такое делаете? Зачем?
C# это не C++, не нужно здесь такого.

Теперь о том, почему это все не будет работать.

1) Когда вы создаете переменную структурного типа, она создается в стеке текущего метода.
Это значит, что после выхода из этого метода, объект будет уничтожен.
Поэтому вот в этом методе:
C#
1
2
3
4
public void Push(int value)
{ 
  head = new Node(value, head);
}
вы в лучше случае получите ссылку на переменную в стеке, которая будет сразу же уничтожена после выхода из метода.
Вам же этого не нужно?

2) Далее, допустим структурная переменная может быть отправлена в кучу через боксинг (для этого достаточно закастить ее к object). И тогда вы сможете получить указатель на кучу.
Но и здесь проблема. В C# память управляемая. Это значит в том числе и то, что участки памяти могут самопроизвольно перемещаться менеджером памяти, без вашего участия.
Поэтому указатель на кучу со временем станет неактуальным и будет показывать не туда, куда нужно.
Именно по этой причине использовать указатели на managed объекты можно только внутри специального оператора fixed. Этот оператор запрещает перемещать память, пока исполняется код внутри него.
Поэтому вы не сможете сделать указатель на managed объект как поле класса. Указатели могут быть только внутри fixed.

3) Есть обходной маневр. Вы можете переместить (маршалировать) вашу структуру в неуправляемую память (см класс Marshal). Но это явно не Pure C#. Это бывает необходимо только для общения со внешними неуправляемыми библиотеками.

Цитата Сообщение от Соколиный глаз Посмотреть сообщение
как исправить?
Не нужно извращаться с указателями, делайте Node классом, а не структурой и все будет ок.

PS Да и еще, вы в своих постах очень часто используете краткую запись методов с оператором =>. Я конечно понимаю, что это модно и молодежно, но это мешает читать и отлаживать код.
Если ваш метод подразумевает какую-то логику, лучше оформлять его стандартным методом с фигурными скобками.
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
19.02.2019, 10:24  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
Бррр.... что это вы вообще такое делаете? Зачем?
Хочу практики по unsafe коду.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
19.02.2019, 10:27
Лучший ответ Сообщение было отмечено Соколиный глаз как решение

Решение

Цитата Сообщение от Соколиный глаз Посмотреть сообщение
На что заменить?
На самостоятельное выделение памяти под ноды в неуправляемом сегменте через класс Marshal.
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
19.02.2019, 10:28  [ТС]
Сообщения что-то дублируются...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.02.2019, 10:28
Помогаю со студенческими работами здесь

Не удается неявно преобразовать тип double в тип bool
static double func1 (double x) { double y = x + 1; return y; } static void...

Не удается неявно преобразовать тип string в тип bool
Должно выводиться имя студента, его возраст и есть ли у него стипендия. using System; using System.Collections.Generic; using...

Возникает ошибка в 86 строке : Не удается неявно преобразовать тип "int" в "int[ , ]". Как исправить?
using System; static class MatrixExt { public static int RowsCount(this int matrix) { return...

Не удается неявно преобразовать тип
Collider2D colliders = Physics2D.OverlapCircle(check.position, 0, WhatIsRock); Не удается неявно преобразовать тип...

Не удается неявно преобразовать тип
Продолжаю изучать С#, делая уроки из курса MS. Стоит задача сделать секундомер для UWP. Приложение простое: клик по кнопке и начало отсчета...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru